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

PieCloudDB中按连续日期分组求和Flag=1的Flow值问题排查

问题分析与解决:按连续日期分组求和Flag=1的Flow值

数据情况

现有PieCloudDB数据库表数据如下:

DateFlowFlag
2024-05-205831
2024-05-219470
2024-05-222161
2024-05-233751
2024-05-244921
2024-05-258160
2024-05-267530
2024-05-276291
2024-05-281041
2024-05-295670
2024-05-301281

需求

对Flag为1的Flow值按连续日期分组求和,预期输出:

StartEndSum
2024-05-202024-05-20583
2024-05-222024-05-241083
2024-05-272024-05-28733
2024-05-302024-05-30128

尝试的SQL及错误结果

尝试的SQL语句:

WITH CTE AS (
    SELECT
        date,
        flow,
        flag,
        ROW_NUMBER() OVER (ORDER BY date) - ROW_NUMBER() OVER (PARTITION BY flag ORDER BY date) AS grp
    FROM mytable
    WHERE flag = 1
)
SELECT
    MIN(date) AS start,
    MAX(date) AS end,
    SUM(flow)
FROM CTE 
GROUP BY grp
ORDER BY start;

得到的错误结果:

StartEndSum
2024-05-202024-05-302527

问题原因

CTE中提前加入WHERE flag = 1过滤条件,导致第一个ROW_NUMBER() OVER (ORDER BY date)仅对flag=1的行排序,和第二个按flag分区后的行号同步递增,两者差值始终为0,所有flag=1的行被归为同一组,最终求和结果是所有符合条件的Flow总和,无法区分非连续日期段。

修正后的SQL

方案一:保留全表计算分组标识后过滤

先基于全表数据计算分组标识,再筛选flag=1的行进行聚合:

WITH CTE AS (
    SELECT
        date,
        flow,
        flag,
        ROW_NUMBER() OVER (ORDER BY date) - ROW_NUMBER() OVER (PARTITION BY flag ORDER BY date) AS grp
    FROM mytable
)
SELECT
    MIN(date) AS start,
    MAX(date) AS end,
    SUM(flow) AS sum
FROM CTE 
WHERE flag = 1
GROUP BY grp
ORDER BY start;

方案二:基于日期差值分组

直接通过日期与行号的差值判断连续日期,逻辑更直观:

WITH CTE AS (
    SELECT
        date,
        flow,
        flag,
        date - INTERVAL '1 day' * ROW_NUMBER() OVER (PARTITION BY flag ORDER BY date) AS grp
    FROM mytable
    WHERE flag = 1
)
SELECT
    MIN(date) AS start,
    MAX(date) AS end,
    SUM(flow) AS sum
FROM CTE
GROUP BY grp
ORDER BY start;

内容的提问来源于stack exchange,提问作者Meliodas Dragon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 22:04:51