sql sum条件求和_Hive中使用over()实现累积求和和滑动求和
上一篇咱們介紹了三個常用的排序函數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)結果如下:
有沒有學到新東西呢~~~
總結
以上是生活随笔為你收集整理的sql sum条件求和_Hive中使用over()实现累积求和和滑动求和的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不同系统下的shell的不同_不同论文检
- 下一篇: 戴尔硬盘保护增强套件_拆解戴尔服务器,看