窗口函数有哪几类?全面说一下
引言
要解答以上问题,需要先确认数据库的范畴,本文以hive 的sql为例。
hive的窗口函数有哪几类,则可以参考官方文档LanguageManual WindowingAndAnalytics
窗口函数有哪几类
在hive中,窗口函数可以分为以下几类
- 标准聚合类
- count
- sum
- min
- max
- avg
- std
- 排序类
- row_number
- rank
- dense_rank
- percent_rank
- 分析类
- cume_dist
- ntile
- top类
- lead
- lag
- first_vlaue
- last_value
窗口函数的用法
row_number
row_number 比较简单,排序,如遇到值相同,不跳号,会随机分配序号。
1 | select row_number() over( order by col1 ) as row_num |
最终的结果为
row_num | col1 | col2 |
---|---|---|
1 | 5 | 3 |
2 | 10 | 2 |
3 | 10 | 1 |
4 | 20 | 4 |
rank
rank 排序,如遇到值相同,则会分配相同的序号,同时会跳号。
1 | select rank() over( order by col1 ) as rank_num |
最终的结果为
row_num | col1 | col2 |
---|---|---|
1 | 5 | 3 |
2 | 10 | 2 |
2 | 10 | 1 |
4 | 20 | 4 |
dense_rank
dense_rank 排序,如遇到值相同,则会分配相同的序号,但不会跳号。
1 | select dense_rank() over( order by col1 ) as rank_num |
最终的结果为
row_num | col1 | col2 |
---|---|---|
1 | 5 | 3 |
2 | 10 | 2 |
2 | 10 | 1 |
3 | 20 | 4 |
dense_rank
计算该值的百分位,如果值相同,按第一个值的百分位计算。
百分位为 i/(n-1)
1 | select percent_rank() over( order by col1 ) as rank_num |
最终的结果为
row_num | col1 | col2 |
---|---|---|
0 | 5 | 3 |
0.333 | 10 | 2 |
0.6666 | 10 | 1 |
1 | 20 | 4 |
1 | select percent_rank() over( order by col1 ) as rank_num |
最终的结果为
row_num | col1 | col2 |
---|---|---|
0 | 5 | 3 |
0.333 | 10 | 2 |
0.333 | 10 | 1 |
1 | 20 | 4 |