Hive--14---使用sum() over() 实现累积求和
Posted 高高for 循环
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive--14---使用sum() over() 实现累积求和相关的知识,希望对你有一定的参考价值。
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
Hive中使用over()实现累积求和
1.总求和
sum(需要求和的列) over(partition by 分组列 )
数据准备
需求1
以地区号+网点号+币种 为唯一键,求总的金额
需求2
以地区号+网点号+币种 为唯一键,
state=0的记录金额相加, 反之 金额相减。
求最后总的金额
需求3
以地区号+网点号+币种 为唯一键,
state=0的记录金额相加, 反之 金额相减。
唯一键相同的最后只出一笔记录 求最后总的金额
2.累积求和
sum(需要求和的列) over(partition by 分组列 order by 排序列 asc/desc)
数据介绍
- 咱们有三列数据,分别是员工的姓名、月份和销售额:
需求1
对每个员工的销售业绩的累积求和
sum(需要求和的列) over(partition by 分组列 order by 排序列 asc/desc)
select
*,
sum(cnt) over(partition by name order by month) as total_cnt
from
default.salerinfo
3. 滑动求和
sum(需要求和的列) over(partition by 分组列 order by 排序列 range between … and …)
- 这里需要在over函数中使用range between and指定窗口的大小,向前使用preceding,向后使用following。
- 如2 preceding and 1 following指定的窗口包括当前行、当前行前面两行以及当前行后面一行,总共4行。
数据介绍
- 咱们有三列数据,分别是员工的姓名、月份和销售额:
需求1
要求每个月对应的最近三个月的业绩之和(包含本月在内)
sum(cnt) over(partition by name order by month
range between 2 preceding and 0 following)
如果不想写0 following,另一种更为合适的写法是使用current row:
sum(cnt) over(partition by name order by month
range between 2 preceding and current row)
两种写法都是可以的,结果如下:
可以看到,在前面的数据不足两行时,有几行就对几行求和。如1月份的滑动求和即本身,2月份的求和结果时1月份和2月份的累积。
需求2
更进一步,如果我们想实现不包含本月在内的前三个月的求和,该怎么实现呢?
方法1: 是使用4行的滑动求和减去当前行的结果
方法2: 另一种是range两边都使用preceding:
select
*,
sum(cnt) over(partition by name order by month
range between 3 preceding and 1 preceding) as total_cnt
from
default.salerinfo
- 1 preceding换成 -1 following也可以,二者是等价的
sum(cnt) over(partition by name order by month
range between 3 preceding and -1 following)
结果如下:
以上是关于Hive--14---使用sum() over() 实现累积求和的主要内容,如果未能解决你的问题,请参考以下文章
SUM() OVER (PARTITION BY) AS - 存在重复项时
在mysql中,sum(a)和sum(a) over()有啥区别?