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

如何标记满足时长重复或含0时长条件的日期下所有记录?

解决思路与SQL实现

你的核心问题是按日期维度判断两个触发条件,然后批量标记当日所有记录,原思路按date,code,duration分区统计无法跨Code识别重复时长,调整窗口函数的分区方式即可同时处理两种场景:

触发条件拆解

  • 条件1:当日存在至少两条同Duration的记录(无论Code是否为SH)
  • 条件2:当日存在至少一条Duration=0的记录

只要满足任一条件,当日所有记录的FLAG设为Y。

实现SQL

SELECT 
    Date,
    Code,
    Duration,
    CASE 
        WHEN has_duplicate_duration = 1 OR has_zero_duration = 1 THEN 'Y'
        ELSE 'N'
    END AS FLAG
FROM (
    SELECT 
        Date,
        Code,
        Duration,
        -- 判断当日是否有重复Duration的记录
        MAX(CASE WHEN cnt_by_date_duration > 1 THEN 1 ELSE 0 END) OVER (PARTITION BY Date) AS has_duplicate_duration,
        -- 判断当日是否有Duration=0的记录
        MAX(CASE WHEN Duration = 0 THEN 1 ELSE 0 END) OVER (PARTITION BY Date) AS has_zero_duration
    FROM (
        SELECT 
            Date,
            Code,
            Duration,
            -- 统计每个日期+Duration组合的记录数
            COUNT(1) OVER (PARTITION BY Date, Duration) AS cnt_by_date_duration
        FROM your_table_name
    ) t1
) t2;

针对示例数据的验证

  1. 含重复时长的场景:4/2/23当天Duration=510的记录有2条,has_duplicate_duration为1,所有记录FLAG=Y
  2. 含0时长的场景:4/2/23当天存在Duration=0的记录,has_zero_duration为1,所有记录FLAG=Y

补充说明

如果你的需求中“匹配Code为SH的Duration”是指仅当SH的Duration出现重复才触发条件1,可以调整内层的统计逻辑:

-- 仅统计SH的Duration重复情况
COUNT(CASE WHEN Code = 'SH' THEN 1 END) OVER (PARTITION BY Date, Duration) AS cnt_sh_duration

然后在判断has_duplicate_duration时,改为MAX(CASE WHEN cnt_sh_duration >1 THEN 1 ELSE 0 END) OVER (PARTITION BY Date)即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 02:15:22