Presto SQL:同一列按组求和并按指定Flag拆分数据汇总
解决Presto SQL按分隔记录分组求和的问题
这个需求核心是用flag='0-1'的记录作为分隔点,把同name的日志拆分成不同组,再对每组的seconds求和。咱们可以用Presto的窗口函数轻松实现,步骤如下:
思路拆解
- 保证数据顺序:日志是按时间生成的,必须先按
logtime排序,确保分隔点的位置正确。 - 生成分组标识:用窗口函数统计每条记录之前(按时间顺序)出现过多少个
flag='0-1'的分隔记录,这个统计值就是该记录的分组ID——每遇到一个分隔点,后面的记录就自动归到新的组。 - 过滤+分组求和:过滤掉分隔点本身(因为它们不需要参与求和),最后按
name和分组ID分组,对seconds求和即可。
完整Presto SQL代码
WITH grouped_records AS ( SELECT logtime, name, seconds, flag, -- 统计当前记录之前(不包含自身)的分隔点数量,作为分组ID SUM(CASE WHEN flag = '0-1' THEN 1 ELSE 0 END) OVER ( PARTITION BY name ORDER BY logtime ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ) AS group_id FROM your_log_table -- 替换成你的实际表名 ) SELECT name, SUM(seconds) AS seconds FROM grouped_records WHERE flag = '1-1' -- 过滤掉分隔点记录 GROUP BY name, group_id ORDER BY group_id; -- 按分组顺序输出结果
结果验证
运行这段代码后,会得到你想要的结果:
name seconds a 60 a 30 a 30
- 第一组是第一个分隔点前的两条
1-1记录,30+30=60 - 第二组是两个分隔点之间的一条
1-1记录,和为30 - 第三组是第二个分隔点后的一条
1-1记录,和为30
内容的提问来源于stack exchange,提问作者Lynne
相关产品推荐
相关产品推荐

