指点成金-最美分享吧

登录

Hive--14---使用sum() over() 实现累积求和

佚名 举报

篇首语:本文由小编为大家整理,主要介绍了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
    • 对每个员工的销售业绩的累积求和
  • 3. 滑动求和
    • ==sum(需要求和的列) over(partition by 分组列 order by 排序列 range between ... and ...)==
    • 数据介绍
    • 需求1
    • 要求每个月对应的最近三个月的业绩之和(包含本月在内)
    • 需求2
    • 更进一步,如果我们想实现不包含本月在内的前三个月的求和,该怎么实现呢?
      • 方法1: 是使用4行的滑动求和减去当前行的结果
      • 方法2: 另一种是==range两边都使用preceding==:


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_cntfrom 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_cntfrom 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() 实现累积求和的主要内容,如果未能解决你的问题,请参考以下文章