美文网首页
数据分析EPHS(12)-Hive中使用over()实现累积求和

数据分析EPHS(12)-Hive中使用over()实现累积求和

作者: 文哥的学习日记 | 来源:发表于2020-03-29 19:22 被阅读0次

    上一篇咱们介绍了三个常用的排序函数row_number(),rank()和dense_rank()。这三个函数需要配合开窗函数over()来实现排序功能。但over()的用法远不止于此,本文咱们来介绍如何实现累计求和和滑动求和。

    1、数据介绍

    咱们有三列数据,分别是员工的姓名、月份和销售额:

    接下来,咱们实现两个主要的功能,对每个员工的销售业绩的累积求和以及滑动求和(每个月计算其最近三个月的总销售业绩)

    2、累积求和

    实现累积求和,使用sum()函数配合over()来实现,具体的实现语法如下:

     sum(需要求和的列) over(partition by 分组列 order by 排序列 asc/desc)
    

    本例中的SQL代码如下:

    select
     *,
     sum(cnt) over(partition by name order by month) as total_cnt
    from
     default.salerinfo
    

    结果如下:

    3、滑动求和

    累积求和还是比较简单的,滑动求和就需要用到over中的另一用法了:

     sum(需要求和的列) over(partition by 分组列 order by 排序列 range between ... and ...)
    

    这里需要在over函数中使用range between and指定窗口的大小,向前使用preceding,向后使用following。如2 preceding and 1 following指定的窗口包括当前行、当前行前面两行以及当前行后面一行,总共4行。

    如在本例中,我们想要求每个月对应的最近三个月的业绩之和(包含本月在内),代码如下:

    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月份的累积。

    更进一步,如果我们想实现不包含本月在内的前三个月的求和,该怎么实现呢?一种是使用4行的滑动求和减去当前行的结果,另一种是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)
    

    结果如下:

    有没有学到新东西呢~~~

    相关文章

      网友评论

          本文标题:数据分析EPHS(12)-Hive中使用over()实现累积求和

          本文链接:https://www.haomeiwen.com/subject/zqiuuhtx.html