开窗函数和row_number()

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开窗函数和row_number()相关的知识,希望对你有一定的参考价值。

参考技术A 窗口函数的引入是为了解决 想要既显示聚集前的数据,又要显示聚集后的数据。
开窗函数对一组值进行操作,不需要使用GROUP BY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。

over() 按所有行进行分组
over(partition by xxx) 按xxx分组的所有行进行分组
over(partition by xxx order by aaa) 按xxx分组,按列aaa排序 的按到当前行(含当前行)进行分组
over前可以加聚合函数 例如sum count avg min max等
over前也可以加 first_value last_value等
windows 字句 用来制定累加的方式
rank() over等的用法

参考资料: https://blog.csdn.net/qq_26937525/article/details/54925827

1、LAG(col,n,DEFAULT) 用于统计窗口内往上第n行值
2、LEAD(col,n,DEFAULT) 用于统计窗口内往下第n行值
3、FIRST_VALUE(column)取分组内排序后,截止到当前行,第一个值
4、LAST_VALUE(column)取分组内排序后,截止到当前行,最后一个值
5、row_number() 分组排序功能,row_number()从1开始,为每一条分组记录返回一个数字 (在row_number中排序的时候,可以通过NULLS LAST、NULLS FIRST来控制有NULL的输出)

这里LAG、LEAD统计窗口内往上或者往下第N行值的情况 是基于自己当前行去做的操作

参考资料: http://lxw1234.com/archives/2015/04/190.htm

ROW_NUMBER() OVER()函数用来为每条记录返回一个行号,可以用来对记录进行排序并返回该序号,序号从1开始排序
over()是聚集函数,可以给记录进行分组、排序;row_number()不能单独使用,必须搭配over()才能使用

比如示例

如果需要随便添加一个序号的话 可以使用 row_number() over()
如果需要排序分组的话 在over 中添加想要分组或者排序的字段

大数据之Hive:Hive 开窗函数

前言

书接上回,上回我们把聚合开窗函数讲完了,闲言少叙,这次我们讲解排序开窗函数;
排序开窗函数,包含row_number开窗函数,rank开窗函数,dense_rank开窗函数,ntile开窗函数和percent_rank开窗函数;
这次重点讲解row_number开窗函数,ntile开窗函数和percent_rank开窗函数;

1.row_number开窗函数

语义:从1开始对分区内的数据排序
排序类似:1,2,3,4,5。

-- row_number 开窗函数

select studentid,departmentid,classid,math,
-- 对分区departmentid,classid内的数据按math排序
row_number() over(partition by departmentid,classid order by math) as row_number
from student_scores;

结果
studentid   departmentid    classid math    row_number
111         department1     class1  69      1
113         department1     class1  74      2
112         department1     class1  80      3
115         department1     class1  93      4
114         department1     class1  94      5
124         department1     class2  70      1
121         department1     class2  74      2
123         department1     class2  78      3
122         department1     class2  86      4
216         department2     class1  74      1
215         department2     class1  82      2
212         department2     class1  83      3
211         department2     class1  93      4
213         department2     class1  94      5
214         department2     class1  94      6
223         department2     class2  74      1
222         department2     class2  78      2
224         department2     class2  80      3
225         department2     class2  85      4
221         department2     class2  99      5

结果解释:
    同一分区,相同值,不同序。如studentid=213 studentid=214 值都为94 排序为5,6

2.rank开窗函数

同row_number开窗函数
语义:从1开始对分区内的数据排序
排序类似:1,2,2,4,5。

3.dense_rank开窗函数

同row_number开窗函数
语义:从1开始对分区内的数据排序
排序类似:1,2,2,3,4。

4.ntile开窗函数

语义:将分区中已排序的行划分为大小尽可能相等的指定数量的排名的组,并返回给定行所在的组的排名。

-- ntile 开窗函数

select *,
-- 对分区内的数据分成两组
ntile(2) over(partition by departmentid order by math) as ntile1,
-- 对分区内的数据分成三组
ntile(3) over(partition by departmentid order by math) as ntile2
from student_scores;

结果
id  studentid   language    math    english classid departmentid    ntile1  ntile2
1   111         68          69      90      class1  department1     1       1
9   124         76          70      76      class2  department1     1       1
6   121         96          74      79      class2  department1     1       1
3   113         90          74      75      class1  department1     1       2
8   123         70          78      61      class2  department1     1       2
2   112         73          80      96      class1  department1     2       2
7   122         89          86      85      class2  department1     2       3
5   115         99          93      89      class1  department1     2       3
4   114         89          94      93      class1  department1     2       3
18  223         79          74      96      class2  department2     1       1
15  216         85          74      93      class1  department2     1       1
17  222         80          78      96      class2  department2     1       1
19  224         75          80      78      class2  department2     1       1
14  215         84          82      73      class1  department2     1       2
11  212         76          83      75      class1  department2     1       2
20  225         82          85      63      class2  department2     2       2
10  211         89          93      60      class1  department2     2       2
12  213         71          94      90      class1  department2     2       3
13  214         94          94      66      class1  department2     2       3
16  221         77          99      61      class2  department2     2       3

结果解释:
    第8行
        ntile1:对分区的数据均匀分成2组后,当前行的组排名为2
        ntile2:对分区的数据均匀分成3组后,当前行的组排名为3

5.percent_rank开窗函数

计算给定行的百分比排名。可以用来计算超过了百分之多少的人,不含本身;
计算公式:(当前行的rank值-1)/(分组内的总行数-1)
类似与cume_dist开窗函数,是统计小于当前分数的人数占总人数的比例;

-- percent_rank 开窗函数

select studentid,departmentid,classid,math,
row_number() over(partition by departmentid,classid order by math) as row_number,
percent_rank() over(partition by departmentid,classid order by math) as percent_rank
from student_scores;

结果
studentid   departmentid    classid math    row_number  percent_rank
111         department1     class1  69      1           0.0
113         department1     class1  74      2           0.25
112         department1     class1  80      3           0.5
115         department1     class1  93      4           0.75
114         department1     class1  94      5           1.0
124         department1     class2  70      1           0.0
121         department1     class2  74      2           0.3333333333333333
123         department1     class2  78      3           0.6666666666666666
122         department1     class2  86      4           1.0
216         department2     class1  74      1           0.0
215         department2     class1  82      2           0.2
212         department2     class1  83      3           0.4
211         department2     class1  93      4           0.6
213         department2     class1  94      5           0.8
214         department2     class1  94      6           0.8
223         department2     class2  74      1           0.0
222         department2     class2  78      2           0.25
224         department2     class2  80      3           0.5
225         department2     class2  85      4           0.75
221         department2     class2  99      5           1.0

结果解释:
    studentid=115,percent_rank=(4-1)/(5-1)=0.75
    studentid=123,percent_rank=(3-1)/(4-1)=0.6666666666666666

参考:https://blog.csdn.net/wangpei1949/article/details/81437574

以上是关于开窗函数和row_number()的主要内容,如果未能解决你的问题,请参考以下文章

SqlServer开窗函数

大数据之Hive:Hive 开窗函数

T-SQL开窗函数

sql server中的开窗函数over视图事物

SQL Server排名函数与排名开窗函数

SQL Server排名函数与排名开窗函数