我需要计算过去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
答案 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
如果您提供示例数据,请同时附上匹配的预期输出。在这种情况下,第2018-03-01
天的总和为1500是不可能的,前面的所有行都为1250。
匹配输出使我们可以验证结果并作出反应:)另外,显示您的代码和工作也很有帮助。