部分分组存在时如何将空GROUP_ID记录匹配至对应日期范围分组
解决方案
核心逻辑
你原来的逻辑问题出在直接用当前行的DATE_FROM、DATE_TO做判断,而空GROUP_ID的行这两个字段本身就是空值,当然没法匹配。正确的做法是先把所有已有的有效分组规则(即GROUP_ID非空的行)提取成独立的时间范围维度,再用所有待处理行去匹配这个维度即可。
具体实现SQL
-- 第一步:提取所有有效分组的时间范围规则 WITH valid_group_rules AS ( SELECT ID, GROUP_ID, DATE_FROM, DATE_TO FROM your_table_name -- 替换为你的实际表名 WHERE GROUP_ID IS NOT NULL ) -- 第二步:关联匹配填充GROUP_ID SELECT t.ID, COALESCE(t.GROUP_ID, g.GROUP_ID) AS GROUP_ID, t.DATE_NEW_FROM, t.DATE_NEW_TO, t.NEW_ID FROM your_table_name t LEFT JOIN valid_group_rules g ON t.ID = g.ID AND t.DATE_NEW_FROM BETWEEN g.DATE_FROM AND g.DATE_TO -- 可根据需要添加排序规则 ORDER BY t.ID, t.DATE_NEW_FROM;
注意事项
- 如果业务中存在单个
DATE_NEW_FROM落在同一个ID的多个分组时间范围内的情况,可以再加一层排序取数逻辑,比如用ROW_NUMBER()窗口函数按你需要的优先级(比如时间范围长度、GROUP_ID大小等)排序后取第一条即可,避免匹配出多条重复记录。 - 如果希望用
DATE_NEW_TO也参与范围校验,只需要把关联条件调整为AND t.DATE_NEW_FROM <= g.DATE_TO AND t.DATE_NEW_TO >= g.DATE_FROM,判断两个时间段是否存在交集即可。
内容的提问来源于stack exchange,提问作者TEC23
相关产品推荐
相关产品推荐

