如何限制SQL查询仅读取对应日期范围的学生专业流与薪酬编码匹配数据
问题根因
现有校验逻辑的关联条件仅匹配学生ID和学段,未限制学生就读时段和配置生效时段的对应关系,导致不同时段的配置被交叉匹配,产生大量误报。
修复方案
在左连接的关联条件中新增时间匹配规则,同时修正原有代码的字段名拼写错误,修改后逻辑如下:
- 学生就读的整个时段必须完全落在配置的生效区间内,避免跨时段匹配
- 修正having子句中
date_check和实际定义的校验字段名EnrollmentDate_Check不一致的问题
修改后SQL代码
proc sql; create table detail as select distinct a.student_ID, case when b.studentId = '' then '学生信息表未找到对应行' else '' end as Row_Check, case when b.studentId ^= '' and a.subject_name ^= b.SubjName then '学科名称不匹配' else '' end as Subject_Check, case when b.studentId ^= '' and a.pay_code ^= b.paycode then '薪酬编码不匹配' else '' end as PayCode_Check, case when b.studentId ^= '' and a.stream_code ^= b.Streamcode then '专业流编码不匹配' else '' end as Stream_Check, case when b.studentId ^= '' and (a.start_date < b.StartDate) or (a.end_date > b.EndDate) then '就读日期不在生效范围内' else '' end as EnrollmentDate_Check, a.student_name, a.subject_name, a.start_date, a.end_date, a.participation_code, a.pay_code from student_data a left join StudentInfo b on b.studentId = a.Student_ID and b.section = a.section /* 新增时间范围匹配规则,确保学生数据和对应时段的配置匹配 */ and a.start_date >= b.StartDate and a.end_date <= b.EndDate having Row_Check ^= '' or Subject_Check ^= '' or PayCode_Check ^= '' or Stream_Check ^= '' or EnrollmentDate_Check ^= '' order by a.student_ID, a.student_name; quit;
补充说明
如果存在学生就读时段跨2021年12月31日和2022年1月1日的情况,建议先将该类记录拆分为2021年底前、2022年后两条独立记录,再执行上述校验逻辑,避免漏判。
内容的提问来源于stack exchange,提问作者Bold
相关产品推荐
相关产品推荐

