MySQL跨表查询:匹配最近日期值的问题及修正需求
解决方案:匹配Table2数据到Table1的两种实现方式
问题核心
需要为Table1中每个idno的记录,匹配Table2中满足startdate <= createddate且日期最接近startdate的createddate和status字段,现有查询未筛选出每个idno下符合条件的目标记录,导致所有同idno记录都关联了Table2的同一行。
实现预期结果1(每个idno仅保留匹配的一条记录)
仅保留每个idno中startdate最大且满足startdate <= createddate的记录,并关联Table2的对应字段:
SELECT t1.idno, t1.startdate, t2.createddate, t2.status FROM tmp.Table1 t1 INNER JOIN tmp.Table2 t2 ON t1.idno = t2.idno AND t1.startdate <= t2.createddate WHERE t1.startdate = ( SELECT MAX(sub.startdate) FROM tmp.Table1 sub WHERE sub.idno = t1.idno AND sub.startdate <= t2.createddate );
逻辑说明
- 子查询找到每个
idno下满足startdate <= createddate的最大startdate; - 仅保留Table1中等于该最大
startdate的记录,与Table2关联获取对应字段。
实现预期结果2(保留Table1所有记录,仅填充目标行)
保留Table1全部记录,仅为每个idno中startdate最大且满足条件的记录填充Table2字段,其余记录对应字段留空:
SELECT t1.idno, t1.startdate, CASE WHEN t1.rn = 1 THEN t2.createddate END AS createddate, CASE WHEN t1.rn = 1 THEN t2.status END AS status FROM ( SELECT idno, startdate, -- 按idno分组,startdate降序排序,标记最新的一条为1 ROW_NUMBER() OVER (PARTITION BY idno ORDER BY startdate DESC) AS rn FROM tmp.Table1 ) t1 LEFT JOIN tmp.Table2 t2 ON t1.idno = t2.idno AND t1.startdate <= t2.createddate AND t1.rn = 1;
逻辑说明
- 子查询通过
ROW_NUMBER()窗口函数,为每个idno的记录按startdate降序标记序号,最新的记录序号为1; - 左关联Table2,仅当序号为1且满足日期条件时,填充
createddate和status,其余记录对应字段返回NULL。
内容的提问来源于stack exchange,提问作者jon
相关产品推荐
相关产品推荐

