背景: 使用hive-sql到一定的层次之后,对于这些函数需要透彻的理解,尤其是它适合的使场景。
1. https://cwiki.apache.org/confluence/display/Hive/LanguageManual+WindowingAndAnalytics hive关于窗口函数和分析函数的官方文档。
备注:https://www.jianshu.com/p/acc8b158daef 比较靠谱的中文版本
2. 内容:
a. 窗口函数:
1. lead/lag/first_value/last_value
2. lead: lead(col,n,default)统计分组内往下第n行的值
3.lag:lag(col,n,default)统计分组内往上第n行值
4.first_value:分组排序后的,截止到当前行的第一个值
5.last_value:分组排序后,截止到当前行最后一个值
b. over语句:
1. 跟在count/sum/min/max/avg 聚合后面
2. 窗口规范:TBD
3. 当order by 后缺少窗口从句条件时,默认窗口规范:range between unbounded preceding and current row
4. 当order by和窗口从句都缺失时,默认窗口规范:row between unbounded preceding and unbounded following
c. 分析函数:rank/row_number/dense_rank/cume_dist/percent_rank/ntile
1. row_number():分组内排序,1234567
2. rank():在分组内排序,排名相等会在名次中留下空位
3. dense_rank():在分组内排序,排名相等的不会留下空位,但是名次相同
4.CUME_DIST():小于等于当前值的行数除以分组内的总行数。比如,统计小于等于当前薪水的人数占总人数的比例。
5.PERCENT_RANK():分组内当前行的RANK值-1/分组内 总行数-1
6. ntile:用于将分组数据按照顺序切分成n片,返回当前切片值,如果切片不均匀,默认增加第一个切片的分布。NTILE不支持ROWS BETWEEN,比如NTILE(2) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN 3 PERCEDING AND CURRENT ROW)
3.细节内容:
a. PRECEDING:往前
b. FOLLOWING:往后
c. CURRENT ROW:当前行
d. UNBOUNDED:起点,UNBOUNDED PRECEDING 表示从前面的起点, UNBOUNDED FOLLOWING:表示到后面的终点
以下内容参考:https://www.cnblogs.com/swg1124/p/7089683.html
e.grouping sets: 在一个group by语句里面,根据不同的维度组合进行聚合,等价于group by 的结果进行uniinall
f.grouping__id:表示结果属于哪一个分组集合.
g. cube:根据group by的维度的所有组合进行聚合: with cube
h.rollup:是cube的子集,以最左侧的维度为主,从该维度进行层级聚合