MySQL 8.0 推出了窗口函数,在8.0 之前 将数据进行分组操作会将多行合并成一行,而窗口函数则相反。
以下是测试数据:
传统分组SQL:
SELECT dept_name,sum(age) from dept_table GROUP BY dept_name
查询结果:
使用窗口函数进行分组SQL:
SELECT
id,
dept_name,
NAME,
age,
SUM(age) OVER (PARTITION BY dept_name ORDER BY id DESC) AS totalAge
FROM
dept_table
查询结果:
窗口函数的关键字是 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
查询结果: