如何在Hive中实现MTD滚动求和,支持灵活扩展QTD、YTD累计计算
解决方案
自然月累计(MTD)实现
你需要的自然月重置滚动累计不需要用interval实现,直接通过窗口函数分区即可完成,逻辑更简洁适配性更强,示例代码如下(假设你的表名为event_table,event_date为Date类型):
SELECT event_date, v, SUM(v) OVER ( -- 按年月分区,不同自然月的数据会拆分到独立窗口 PARTITION BY date_format(event_date, 'yyyy-MM') -- 窗口内按日期升序排列 ORDER BY event_date -- 求和范围为当前分区内第一行到当前行 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS cum_v FROM event_table;
执行后输出结果完全符合你给出的预期格式,每个自然月第一天累计值自动重置为当月首行的v值。
QTD、YTD扩展实现
方案可以灵活扩展到季度累计(QTD)、年度累计(YTD)需求,仅需要调整窗口的分区规则即可:
SELECT event_date, v, -- MTD 自然月累计 SUM(v) OVER (PARTITION BY date_format(event_date, 'yyyy-MM') ORDER BY event_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cum_v_mtd, -- QTD 季度累计 SUM(v) OVER (PARTITION BY date_format(event_date, 'yyyy-Q') ORDER BY event_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cum_v_qtd, -- YTD 年度累计 SUM(v) OVER (PARTITION BY year(event_date) ORDER BY event_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cum_v_ytd FROM event_table;
如果你的event_date字段为字符串类型,先通过to_date(event_date, 'yyyy-MM-dd')转换为日期类型再参与计算即可。
滚动区间的interval用法说明
如果你需要实现非自然周期的滚动累计(如近30天、近7天),可以使用interval语法(仅Hive 2.1及以上版本支持),示例如下:
-- 近30天滚动累计求和 SUM(v) OVER ( ORDER BY event_date RANGE BETWEEN INTERVAL '29' DAY PRECEDING AND CURRENT ROW ) AS rolling_30d_sum
内容的提问来源于stack exchange,提问作者lanrete
相关产品推荐
相关产品推荐

