基于日期区间筛选匹配对应导师名称的SQL查询问题
问题
我有一张示例源表,目前查询时因为存在多名导师会返回多条记录,有源表查询结果示意图可供参考。
我需要实现的逻辑为:当exam_date处于某条记录的effective date与下一条记录的effective date区间内时,仅选中对应记录的tutor_name,有对应的期望输出结果示意图可供参考。
解决方案
你可以通过窗口函数LEAD先给每条导师配置记录生成对应的有效期截止时间,整理出每个导师的生效区间后再和考试表关联匹配即可,具体实现逻辑如下:
- 先对导师配置表做预处理:按
effective_date升序排序,用LEAD函数取后一条记录的生效日期作为当前记录的有效期截止值,最后一条没有后续记录的可以给一个极大日期(比如9999-12-31)作为截止值,覆盖所有未来的考试日期。 - 关联考试表和预处理后的导师有效期表,用区间匹配规则筛选对应导师即可,注意用左开右闭的匹配规则避免边界日期重复匹配。
参考SQL代码如下:
-- 预处理生成导师的有效任职区间 WITH tutor_valid_period AS ( SELECT tutor_name, effective_date, -- 取后一条的生效日期作为当前的截止日期,最后一条默认到9999-12-31 LEAD(effective_date, 1, '9999-12-31'::DATE) OVER (ORDER BY effective_date) AS expiry_date FROM tutor_config -- 替换为你实际的导师配置表名 ) SELECT e.*, t.tutor_name FROM exam e -- 替换为你实际的考试表名 LEFT JOIN tutor_valid_period t ON e.exam_date >= t.effective_date AND e.exam_date < t.expiry_date
上述写法可以保证每条考试记录只会匹配到唯一对应的导师,不会出现多记录重复返回的问题。
内容的提问来源于stack exchange,提问作者JamesBowery
相关产品推荐
相关产品推荐

