sql 窗口函数总结:
1.窗口函数语法:
- <窗口函数> over ( partition by <用于分组的字段名> order by <用于排序的字段名> )
- demo:
-
row_number() over (partition by area order by product desc) as rank; # 降序排列后,第几行,就是第几名
-
- demo:
- <窗口函数>的位置,可以放以下两种函数:
- 专用窗口函数,如rank, dense_rank, row_number等 (不需要加字段名:rank())
- 聚合函数,如sum,avg,count,max,min等(使用时要加对应的字段名:sum(字段名))
2.窗口函数有以下功能特点:
- 同时具有分组(partition by)和排序(order by)的功能
- 不减少原表的行数,所以经常用来在每组内排名
3.注意事项
- 3.1 窗口函数原则上只能写在select子句中
- 3.2 partition by 可以省略,这样就只做排序不做分组
- 3.3 dense_rank:当有并列排名时,只占一个排名(并列第1的有3个人,第4个人排名记为第2名)
- 3.4 rank:当有并列排名时,有几个人就占几个排名(并列第1的有3个人,第4个人排名记为第4名)
4.窗口函数使用场景
- 由于窗口函数不减少原表的行数,所以当需要“在每组内进行排名”时经常会被用到,例如:
- 排名问题:按每个班级的成绩进行组内排名
- topN问题:找出每个班级排名前N的学生