文章目录

  • 1 窗口函数概述
  • 2 语法规则
  • 3 窗口聚合函数的使用
  • 4 窗口表达式
  • 5 窗口排序函数
  • 5.1 row_number家族
  • 5.2 ntile函数
  • 6 窗口分析函数


最近工作中经常遇到窗口函数,看了一些视频讲的不是很清楚,于是又查阅了一些资料,通俗的学透它,理解它,之后忘记也可以看这个想起来

1 窗口函数概述

hive 窗口函数 累加 hive窗口函数分组排序_窗口函数


直观去感受一下窗口函数和group by分组之间的区别

hive 窗口函数 累加 hive窗口函数分组排序_数据仓库_02

2 语法规则

hive 窗口函数 累加 hive窗口函数分组排序_窗口函数_03

3 窗口聚合函数的使用

主要包括sum,max,min,avg,接下来以sum为例,其它都类似。窗口函数配合聚合函数功能非常强大,在工作中用的很多

hive 窗口函数 累加 hive窗口函数分组排序_数据仓库_04


特别注意的点:

(1)要不要使用order by。order by当且仅当 在聚合函数中是累计求和的概念,
(2)order by 后面加不加窗口表达式,如果不加,默认从第一行到当前行 (3)上面两个可以溯源到官网

4 窗口表达式

hive 窗口函数 累加 hive窗口函数分组排序_hive_05


一些例子可供参考

hive 窗口函数 累加 hive窗口函数分组排序_hive_06

5 窗口排序函数

5.1 row_number家族

rank:在每个分组中,为每行分配一个从1开始的序列号,考虑重复,例如[1,2,2,4]
row_number:在每个分组中,为每行分配一个从1开始的唯一序列号,递增不重复,例如[1,2,3,4]
dense_rank:在每个分组中,为每行分配一个从1开始的序列号,考虑重复,例如[1,2,2,3]

记忆方法:
对于row_number理解它为行号就行,行号肯定是不重复的;对于dense_rank,理解dense,减少,说明如果出现重复的,序号数字会小于行数。记忆两个剩下的就记住了

注意:
这里order by 不要有累计的想法,但原理上窗口大小还是累计增加的,为了搞混,我们只需要记住这个就是排序

5.2 ntile函数

hive 窗口函数 累加 hive窗口函数分组排序_hive 窗口函数 累加_07

6 窗口分析函数

hive 窗口函数 累加 hive窗口函数分组排序_hive_08


举个例子,以LAG为例

hive 窗口函数 累加 hive窗口函数分组排序_hive 窗口函数 累加_09


FIRST_VALUE:如果出现order by 就是截止到当前行的第一行

LAST_VALUE:如果出现order by 就是截止到当前行的最后一行