mysql GROUP BY + SUM + OVER + ORDER BY实际上是如何工作的?

yfwxisqw  于 2023-03-11  发布在  Mysql
关注(0)|答案(2)|浏览(235)

我理解此查询将生成数字和累积计数:

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个|
| 第二章|三个|
| 三个|六个|
我大概知道这个函数是怎么工作的了,我的子句构造了一些分区,我的分区是,number = 1,number = 2,和number = 3,举个例子,number = 2的情况下,不知何故,SUM()函数神奇地访问了其分区之外的行,该分区由我的window_specx 1 m8n1x“ORBER BY number“指定。

👀但我不明白的是MySQL documentation of ORDER BY in this context与任何事物有什么关系。

订单_子句:ORDER BY子句指示如何对每个分区中的行进行排序。根据ORDER BY子句相等的分区行被视为对等。如果省略ORDER BY,则分区行将无序,不隐含处理顺序,并且所有分区行都是对等的。
一个分区就是一个集合。根据一年级的数学,集合是未排序的。所以在一个分区内排序已经让我的BS检测器出错了。即使你告诉我集合是有序的,我在一年级学习的求和函数肯定不关心它的操作数是按什么顺序排序的。
把这种误解延伸到另一个具体的例子:

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文档意味着 * 一些有用的东西 * 而不仅仅是错误的单词。让我们考虑一下ORDER BY在这里是如何应用的。11不等于12。它们是不同的,所以ORDER BY区分它们。它们都在tens = 10分区中。因此,SUM()函数需要神奇地从tens = 10分区中的11或12行中选择3之和或4之和表达式结果。

**👀它是如何挑选结果的(剧透:它会选择4)?**的和

还有...

👀MySQL文档中的哪些基本智慧是我没有领会到的,或者该文档有何缺陷?

zujrkrfu

zujrkrfu1#

在查询中:

SELECT number,
  SUM(number) OVER (ORDER BY number) cumulative_number
FROM (SELECT 1 number UNION SELECT 2 UNION SELECT 3) inside
GROUP BY number

由于在窗口函数中没有使用PARTITION BY子句,因此窗口函数只有一个分区,也就是说,它将聚合的所有结果行视为一个分区。
聚合返回三行:

  • 1
  • 2
  • 3

然后,窗口函数SUM()计算它的运行和(1,3,6)。

55ooxyrt

55ooxyrt2#

窗口函数允许同时显示单个值和聚合值。可能是GROUP BY number让你感到困惑。
查询:

SELECT number
     , SUM(number) OVER (ORDER BY number) cumulative_number
  FROM (SELECT 1 number UNION SELECT 2 UNION SELECT 3) inside
 GROUP BY number

生成与查询相同的结果:

SELECT number
     , SUM(number) OVER (ORDER BY number) cumulative_number
  FROM (SELECT 1 number UNION SELECT 2 UNION SELECT 3) inside

wndow函数将所有行视为一个分区(除非使用PARTITION BY)。它对每一行进行聚合。SUM(number) OVER (ORDER BY number)应用于所有行。由于查询只有一个普通列和一个窗口函数,因此GROUP BY将不执行任何操作。

相关问题