请求协助实现两表数据匹配:基于日期区间与A列关联
数据表匹配问题解决方案
问题说明
需将两张数据表按以下规则完成匹配:
- 表2的D列日期必须落在表1的D-E日期区间内
- 关联条件包含A列(A列值允许为空)
此前使用join连接两表得到18行错误结果,不符合预期。
数据表示例
表1数据
A B C D E G 600 MT_000 6765 29-04-23 30-04-23 WEEK MT 6758 01-05-23 31-05-23 MONTH 601 MT_0001 6771 01-06-23 30-06-23 WEEK
表2数据
A B C D 601 MT 6758 07-05-23 601 MT 6758 14-05-23 601 MT 6758 21-05-23 601 MT 6758 28-05-23 601 MT 6758 28-05-23 601 MT 6758 04-06-23
期望输出
A B C D E 601 MT 6758 07-05-23 MONTH 601 MT 6758 14-05-23 MONTH 601 MT 6758 21-05-23 MONTH 601 MT 6758 28-05-23 MONTH 601 MT 6758 28-05-23 MONTH 601 MT 6758 04-06-23 WEEK
解决方法
核心逻辑
在join基础上添加严格的日期区间判断和兼容空值的A列关联规则,避免笛卡尔积导致的多余匹配行。
SQL实现示例
先将字符串格式日期转为可比较的日期类型,再执行匹配:
SELECT t2.A, t2.B, t2.C, t2.D, t1.G AS E FROM 表2 t2 JOIN 表1 t1 ON (t2.A = t1.A OR (t2.A IS NULL AND t1.A IS NULL)) AND STR_TO_DATE(t2.D, '%d-%m-%y') BETWEEN STR_TO_DATE(t1.D, '%d-%m-%y') AND STR_TO_DATE(t1.E, '%d-%m-%y');
逻辑说明
- A列关联:通过
OR语句兼容A列空值场景,确保空值也能正确匹配 - 日期校验:转换日期格式后用
BETWEEN判断是否在区间内,避免字符串对比的逻辑错误 - 过滤无效匹配:双重条件同时生效,直接排除不符合规则的组合,解决之前join产生的错误结果问题
内容的提问来源于stack exchange,提问作者Priyal Jain
相关产品推荐
相关产品推荐

