窗口函数(Window Function)
2020-08-16
# SQL
一、排序函数(Ranking Function)
- 排序函数必须有OVER子句
- 排序函数必须有包含ORDER BY的OVER子句,否则语法不通过,不过对于不想排序的场景也可以变通
- 分组内从1开始排序
1.row_number()
返回唯一的值,当碰到相同数据时,排名按照数据中记录顺序依次递增,例如1,2,3,4,5,6,7…
1 | select user_id |
对于不想排序的场景可以变通如下:
1 | select user_id |
2.rank()
返回唯一的值,当碰到相同数据时,此时所有相同数据排名一样,后续排名随着记录行递增,例如1,1,3,3,3,6,7…
1 | select user_id |
3.dense_rank()
返回唯一的值,当碰到相同数据时,此时所有相同数据排名一样,后续排名递增,例如1,1,2,3,4,4,5…
1 | select user_id |
4.nlite()
对序号进行分组处理,将有序分区中的行分发到指定数组的组中
1 | select user_id |
当数据记录数为6条时,nlite(4)分组4则为1,1,2,2,3,4
nlite函数分组依据:
1.每组的记录数不能大于上一组记录数,即编号小的桶放的记录数不能小于编号大的桶
2.所有组中的记录数要么都相同,要么从某一个记录较少的组开始后面所有组的记录数都与该组相同
例如51条记录分为5组,51%5==1不能平均分配,则先分出去一组(51/5)+1 = 11条记录,然后51-11=40计算余下40条记录能否平均分配4组,即40/4=10条记录,则分配完成为11,10,10,10,10而不是11,11,11,11,7