GROUP BY + SUM + OVER + ORDER BY 是如何工作的?

问题描述 投票:0回答:0

我知道这个查询会产生数字和累积计数:

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 文档中的哪些基本智慧,或者该文档有何缺陷?

mysql group-by sql-order-by aggregate-functions database-partitioning
© www.soinside.com 2019 - 2024. All rights reserved.