mysql从8.0开始支持窗口函数,使用窗口函数,会令我们的分组查询变得便捷。
窗口函数,简单来说就是对于一个查询SQL,将其结果集按指定的规则进行分区,每个分区可以看作是一个窗口,分区内的每一行,根据其所属分区内的行数据进行函数计算,获取计算结果,作为该行的窗口函数结果值。
窗口函数和group by有类似之处,其区别在于窗口会对每个分组之后的数据进行分别操作,而group by一般对分组之后的函数使用聚集函数汇总。
窗口函数的语法:
<窗口函数> over (partition by <用于分组的列名> order by <用于排序的列名>)
<窗口函数> 的位置,可以放以下两种函数:
1) 专用窗口函数,包括后面要讲到的 rank, dense_rank, row_number 等专用窗口函数。
2) 聚合函数,如 sum, avg, count, max, min 等
需要强调的一点是:窗口函数是对 where 或者 group by 子句处理后的结果进行操作,所以窗口函数原则上只能写在 select 子句中。
以下是mysql的专用窗口函数一览。点击各函数链接查看具体应用。(※持续更新中)
No | 名称 | 描述 |
1 | CUME_DIST() | 累积分配值 |
2 | DENSE_RANK() | 当前行在其分区中的排名,稠密排序 |
3 | FIRST_VALUE() | 指定区间范围内的第一行的值 |
4 | LAG() | 取排在当前行之前的值 |
5 | LAST_VALUE() | 指定区间范围内的最后一行的值 |
6 | LEAD() | 取排在当前行之后的值 |
7 | NTH_VALUE() | 指定区间范围内第N行的值 |
8 | NTILE() | 将数据分到N个桶,当前行所在的桶号 |
9 | PERCENT_RANK() | 排名值的百分比 |
10 | RANK() | 当前行在其分区中的排名,稀疏排序 |
11 | ROW_NUMBER() | 分区内当前行的行号 |