Hive 窗口函数与分析函数
在 sql 中有一类函数叫做聚合函数,例如 sum()、avg()、max()等等,这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的。但是有时我们想要既显示聚集前的数据,又要显示聚集后的数据,这时我们便引入了窗口函数。窗口函数又叫 OLAP 函数/分析函数,窗口函数兼具分组和排序功能。
窗口函数最重要的关键字是 partition by 和 order by。
具体语法如下:over (partition by xxx order by xxx)
sum、avg、min、max
准备数据
SUM 函数和窗口函数的配合使用:结果和 ORDER BY 相关,默认为升序。
如果不指定 rows between,默认为从起点到当前行;
如果不指定 order by,则将分组内所有值累加;
关键是理解 rows between 含义,也叫做 window 子句:
preceding:往前
following:往后
current row:当前行
unbounded:起点
unbounded preceding 表示从前面的起点
unbounded following:表示到后面的终点
AVG,MIN,MAX,和 SUM 用法一样。
row_number、rank、dense_rank、ntile
准备数据
ROW_NUMBER()使用
ROW_NUMBER()从 1 开始,按照顺序,生成分组内记录的序列。
RANK 和 DENSE_RANK 使用
RANK() 生成数据项在分组中的排名,排名相等会在名次中留下空位 。
DENSE_RANK()生成数据项在分组中的排名,排名相等会在名次中不会留下空位。
NTILE
有时会有这样的需求:如果数据排序后分为三部分,业务人员只关心其中的一部分,如何将这中间的三分之一数据拿出来呢?NTILE 函数即可以满足。
ntile 可以看成是:把有序的数据集合平均分配到指定的数量(num)个桶中, 将桶号分配给每一行。如果不能平均分配,则优先分配较小编号的桶,并且各个桶中能放的行数最多相差 1。
然后可以根据桶号,选取前或后 n 分之几的数据。数据会完整展示出来,只是给相应的数据打标签;具体要取几分之几的数据,需要再嵌套一层根据标签取出。
版权声明: 本文为 InfoQ 作者【大数据技术指南】的原创文章。
原文链接:【http://xie.infoq.cn/article/6476be0d576901c4be0f89de4】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论