SQL Hive - 计算前几个月的滚动 SUM、AVG
Posted
技术标签:
【中文标题】SQL Hive - 计算前几个月的滚动 SUM、AVG【英文标题】:SQL Hive - Calculate the rolling SUM,AVG for previous months 【发布时间】:2018-07-11 21:33:05 【问题描述】:我需要计算 ID 和 Dt 过去 6 个月和 12 个月的 amt 总和 尝试使用 over partition by 和 case 语句,但没有得到预期的 o/p。
Id dt amt
11112222222 2018-03-01 100
11112222222 2018-03-01 100
**11112222222 2017-03-01 100**
11112222222 2017-09-01 100
11112222222 2017-03-01 300
11112222222 2018-01-01 100
11112222222 2018-05-01 200
**11112222222 2016-03-01 450**
11112222222 2018-04-01 500
O/P:
Id Dt Sum6mon Avg6mon Sum12mon Avg12months
11112222222 2018-03-01 400 150 1500 187.5
11112222222 2017-03-01 100 100 550 275
etc...
日期格式 - YYYY-MM-DD
【问题讨论】:
【参考方案1】:尝试使用over partition by
是的,对于诸如滚动总和/平均分析函数之类的东西,我们推荐使用。我认为最好的方法是使用range
窗口子句而不是case when
:
select id, dt, amt,
sum(amt) over (partition by id order by dt range interval '6' month preceding) s06,
avg(amt) over (partition by id order by dt range interval '6' month preceding) a06,
sum(amt) over (partition by id order by dt range interval '12' month preceding) s12,
avg(amt) over (partition by id order by dt range interval '12' month preceding) a12
from t order by dt
SqlFiddle demo
如果您提供示例数据,请同时附上匹配预期输出。在这种情况下,2018-03-01
日的总和不可能是 1500,之前的所有行都是 1250。
匹配的输出使我们能够验证我们的结果并做出反应:) 展示您的代码和努力也很有帮助。
【讨论】:
【参考方案2】:如果您需要每个不同 ID, date
对的 amt
总和和平均值,您可以尝试以下查询:
SELECT
Id,
dt,
SUM(CASE WHEN dt >= from_unixtime(unix_timestamp() - 3600 * 24 * 30 * 6, 'yyyy-MM-dd') THEN amt ELSE 0 END) as Sum6mon,
SUM(amt) as Sum12mon,
AVG(CASE WHEN dt >= from_unixtime(unix_timestamp() - 3600 * 24 * 30 * 6, 'yyyy-MM-dd') THEN amt ELSE 0 END) as Avg6mon,
AVG(amt) as Avg12mon
FROM
<your table name>
WHERE
dt BETWEEN from_unixtime(unix_timestamp() - 3600 * 24 * 30 * 12, 'yyyy-MM-dd') AND from_unixtime(unix_timestamp(), 'yyyy-MM-dd')
GROUP BY Id,dt
;
但是你要记住from_unixtime(unix_timestamp())
的组合很慢,所以尽量用静态日期替换它
【讨论】:
以上是关于SQL Hive - 计算前几个月的滚动 SUM、AVG的主要内容,如果未能解决你的问题,请参考以下文章