mysql窗口函数
前言
我在写sql语句的时候,遇到主表副表一对多的关系,需要主表join副表,并对副表的记录汇总处理等操作。之前处理这样的操作,我都是group by
主表的字段,然后聚合函数处理副表的字段。但如果查询比较复杂,不仅需要副表join的多行数据,又需要对副表聚合查询,group by
就不好用了。并且group by需要好多字段,否则会不满足mysql的语法要求this is incompatible with sql_mode=only_full_group_by
。因此我学习了mysql的窗口函数,来简化这些操作。
简介
窗口函数(Window Functions)允许你在查询结果的行上执行计算,而不必对数据进行分组(GROUP BY
)。
常见使用场景
- 数据分析,如排名、排序、分组统计、计算、前后值比较等
- 对某些分组场景简化SQL,提升效率
- 常用于子查询,将一些复杂条件简化
需求MySQL版本 >= 8
语法结构
1 | function_name(expression) OVER ( |
PARTITION BY
:将结果集划分为不同的分区(类似于GROUP BY
,但不影响行数)。ORDER BY
:指定窗口内数据的排序方式(如排名、累计和等场景需要排序)。frame_clause
:定义窗口的范围(例如,当前行、前 N 行、后续 N 行等)。
常用案例
排名函数
ROW_NUMBER()
:为分区内的每一行分配唯一的序号。RANK()
:根据排序列的值分配排名,值相同时排名并列,后续排名会跳过相应位置。DENSE_RANK()
:根据排序列的值分配排名,值相同时排名并列,但后续排名不会跳过。
示例:
1 | SELECT |
聚合函数
SUM()
:计算分区内的总和(累加)。AVG()
:计算分区内的平均值。MIN()
和MAX()
:计算分区内的最小值和最大值。COUNT()
:计算分区内行数。
示例:
1 | SELECT |
取值函数
FIRST_VALUE()
:取分区中排序后的第一个值。LAST_VALUE()
:取分区中排序后的最后一个值。
示例:
1 | SELECT |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 pyf的日记!