如何标记满足时长重复或含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;
针对示例数据的验证
- 含重复时长的场景:4/2/23当天
Duration=510的记录有2条,has_duplicate_duration为1,所有记录FLAG=Y - 含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
相关产品推荐
相关产品推荐

