日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sql sum条件求和_Hive中使用over()实现累积求和和滑动求和

發布時間:2025/3/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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()实现累积求和和滑动求和的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。