SQL Hive-计算前几个月的滚动SUM,AVG

时间:2018-07-11 21:33:05

标签: sql oracle hadoop hive bigdata

我需要计算过去6个月和12个月的ID和Dt的amt之和 尝试通过and case语句使用over partition,但未获得预期的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

2 个答案:

答案 0 :(得分:1)

如果您需要==和每个amt对的平均值,可以尝试以下查询:

{ID, date}

但是您要记住, 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 ; 组合非常慢,因此请尽可能用静态日期替换

答案 1 :(得分:1)

  

尝试使用过度分区

是的,对于诸如滚动和/平均分析函数之类的建议,建议使用。我认为最好的方法是使用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。 匹配输出使我们可以验证结果并作出反应:)另外,显示您的代码和工作也很有帮助。