You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Presto SQL:同一列按组求和并按指定Flag拆分数据汇总

解决Presto SQL按分隔记录分组求和的问题

这个需求核心是用flag='0-1'的记录作为分隔点,把同name的日志拆分成不同组,再对每组的seconds求和。咱们可以用Presto的窗口函数轻松实现,步骤如下:

思路拆解

  1. 保证数据顺序:日志是按时间生成的,必须先按logtime排序,确保分隔点的位置正确。
  2. 生成分组标识:用窗口函数统计每条记录之前(按时间顺序)出现过多少个flag='0-1'的分隔记录,这个统计值就是该记录的分组ID——每遇到一个分隔点,后面的记录就自动归到新的组。
  3. 过滤+分组求和:过滤掉分隔点本身(因为它们不需要参与求和),最后按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 07:17:41