You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
);

逻辑说明

  1. 子查询找到每个idno下满足startdate <= createddate的最大startdate;
  2. 仅保留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;

逻辑说明

  1. 子查询通过ROW_NUMBER()窗口函数,为每个idno的记录按startdate降序标记序号,最新的记录序号为1;
  2. 左关联Table2,仅当序号为1且满足日期条件时,填充createddate和status,其余记录对应字段返回NULL。

内容的提问来源于stack exchange,提问作者jon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 19:48:45