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()有啥区别?

oracle累积求和分析函数sum over的使用

sum over函数

使用 SQL“sum”和“over”语法的 Totals 和 Runningtotals

在mysql中使用sum() over(Partition by)组合多行数据