我知道这个查询会产生数字和累积计数:
SELECT number
, SUM(number) OVER (ORDER BY number) cumulative_number
FROM (SELECT 1 number UNION SELECT 2 UNION SELECT 3) inside
GROUP BY number
结果:
数字 | 累计数 |
---|---|
1 | 1 |
2 | 3 |
3 | 6 |
我有点明白这个功能是如何工作的。有由我的
GROUP BY
子句“GROUP BY number
”构建的分区。我的分区是 number
= 1,number
= 2 和 number
= 3。例如,在 number
= 2 的情况下,SUM()
函数以某种方式神奇地访问其分区外的行,该分区以某种方式指定通过我的window_spec
order_clause
“ORBER BY number
”。
👀但是我不明白的是在这种情况下ORDER BY的MySQL文档与任何事情有什么关系
order_clause:一个 ORDER BY 子句指示如何对每个分区中的行进行排序。根据 ORDER BY 子句相等的分区行被视为对等行。如果省略 ORDER BY,则分区行是无序的,不暗示处理顺序,并且所有分区行都是对等的。
一个分区是一个集合。集合根据一年级数学未排序。因此,在分区内对某些东西进行排序已经触发了我的 BS 检测器。就算你告诉我集合是有序的,我一年级学的 sum 函数肯定不在乎它的操作数是按什么顺序排列的。
把这个误解延伸到另一个具体的例子:
SELECT ROUND(number, -1) tens
, SUM(COUNT(*)) OVER (ORDER BY number) cumulative_number
FROM (SELECT 1 number UNION SELECT 2 UNION SELECT 11 UNION SELECT 12) inside
GROUP BY tens
假设 MySQL 文档意味着 something useful 而不仅仅是错误的词。让我们考虑一下
ORDER BY
是如何通过 number
s 在这里应用的。 11 不等于 12,它们是不同的,所以用 ORDER BY
来区分它们。它们都在 tens
= 10 分区中。神奇的是,SUM()
函数需要从 tens
= 10 分区中的第 11 行或第 12 行中选择 3 的总和或 4 的总和表达式结果。
👀 它是如何选择结果的(剧透:它选择 4 的和)?
还有...
👀 我没有领会 MySQL 文档中的哪些基本智慧,或者该文档有何缺陷?