MySQL通过窗口函数进行分组

6 阅读1分钟

MySQL 8.0 推出了窗口函数,在8.0 之前 将数据进行分组操作会将多行合并成一行,而窗口函数则相反。

以下是测试数据:

image.png

传统分组SQL:

SELECT dept_name,sum(age) from dept_table GROUP BY dept_name

查询结果:

image.png

使用窗口函数进行分组SQL:

SELECT
id,
dept_name,
NAME,
age,
SUM(age) OVER (PARTITION BY dept_name ORDER BY id DESC) AS totalAge
FROM
dept_table

查询结果:

image.png

窗口函数的关键字是 over,over子句指定如何将查询行划分为组以供窗口函数处理。(每组称为一个窗口)。

MySQL提供了仅用于窗口函数的非聚合函数,比如 ROW_NUMBER(); ROW_NUMBER()就是将每个组内的行数加序号,它是连续的,如果根据值重复的字段进行排序,那么默认会按照任一不重复字段来区分顺序,不会存在并列序号。

每个组加序号的SQL:

SELECT id,dept_name,name,age, ROW_NUMBER() OVER(PARTITION BY dept_name ORDER BY id desc) AS 每组行数序号 FROM dept_table

查询结果:

image.png