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

多表查询:如何获取各里程碑日期对应的前置最新Value值?

如何匹配里程碑对应的最新值记录

需要从两张表中查询每个里程碑对应的目标值,具体需求:

  • Start/Finish里程碑:直接取对应日期的Value
  • 里程碑1/2:取该里程碑日期之前**最新(日期最大)**的记录的Value

源表数据

表1(值记录表)

IDValueDATE
A122024/1/1
A152024/1/2
A202024/1/3
A222024/1/4
A172024/1/5
A192024/1/6
B72024/2/1
B92024/2/2
B52024/2/3
B82024/2/4
B22024/2/5

表2(里程碑表)

IDMileStoneDATE
AStart2024/1/1
A12024/1/3
A22024/1/5
AFinish2024/1/6
BStart2024/2/1
B12024/2/4
BFinish2024/2/5

期望结果

IDValueMilestone
A12Start
A151
A222
A19Finish
B7Start
B51
B2Finish

解决方案

之前用min()函数的思路不对,因为需求是取日期最新的记录,和Value本身的大小无关,必须通过排序日期来筛选目标记录。下面提供两种可行的SQL写法:

方法1:窗口函数(推荐,大数据量性能更优)

SELECT 
    sub.ID,
    sub.Value,
    sub.MileStone
FROM (
    SELECT 
        t2.ID,
        t2.MileStone,
        t1.Value,
        ROW_NUMBER() OVER (
            PARTITION BY t2.ID, t2.MileStone 
            ORDER BY t1.DATE DESC
        ) AS rn
    FROM 表2 t2
    JOIN 表1 t1 ON t1.ID = t2.ID AND t1.DATE <= t2.DATE
) AS sub
WHERE rn = 1
ORDER BY sub.ID, 
         CASE sub.MileStone 
             WHEN 'Start' THEN 1 
             WHEN '1' THEN 2 
             WHEN '2' THEN 3 
             WHEN 'Finish' THEN 4 
         END;

逻辑说明:

  1. 先将两张表按ID关联,只保留值记录表中日期≤里程碑日期的记录
  2. 用ROW_NUMBER()窗口函数按「ID+里程碑」分组,每组内按值记录日期降序排序,最新的记录会被标记为rn=1
  3. 外层筛选rn=1的记录,就是每个里程碑对应的目标值
  4. 最后用CASE语句保证结果按Start→1→2→Finish的顺序排列

方法2:关联子查询(写法简洁)

SELECT 
    t2.ID,
    (SELECT t1.Value 
     FROM 表1 t1 
     WHERE t1.ID = t2.ID AND t1.DATE <= t2.DATE 
     ORDER BY t1.DATE DESC 
     LIMIT 1) AS Value,
    t2.MileStone
FROM 表2 t2
ORDER BY t2.ID, 
         CASE t2.MileStone 
             WHEN 'Start' THEN 1 
             WHEN '1' THEN 2 
             WHEN '2' THEN 3 
             WHEN 'Finish' THEN 4 
         END;

逻辑说明:
对表2的每一行,通过子查询找到对应ID且日期≤里程碑日期的记录,按日期降序取第一条的Value,直接得到目标结果。

内容的提问来源于stack exchange,提问作者A. Romain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 22:14:59