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的主要内容,如果未能解决你的问题,请参考以下文章

前几个月的 SQL 固定日期

Hive - 如何从 Hive 获取最近几个月的数据?

前 3 个月的滚动总和 SQL Server

如何根据上个月的计算更新每个月的期初余额?

HELP!请问怎么通过ABAP程序查到前几个月的库存数?

获取当前时间的前几个月的星期起始结束时间