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

基于两个不同日期列的SQL关联查询问题求助

正确SQL实现方案

你的原SQL问题在于子查询只按id取全局最大的level_date,没有结合level_date <= t2.protc_date的条件筛选,导致只能匹配到那些全局最大level_date小于等于protc_date的记录,无法实现“每个id对应满足level_date <= protc_date的最大level_date”的需求。

以下提供两种可行的实现方案:

方案一:使用窗口函数精准筛选

通过ROW_NUMBER()窗口函数,先关联两表并过滤符合日期条件的记录,再对每个protocol_table的记录(按id和protc_date分组),将对应的level_table记录按level_date降序排序,取排序第一的记录(即最大level_date的那条):

WITH ranked_levels AS (
    SELECT 
        t1.id,
        t1.level_date,
        t1.level,
        t2.protc_date,
        t2.protc,
        -- 按t2的id和protc_date分组,level_date降序排,标记序号
        ROW_NUMBER() OVER (PARTITION BY t2.id, t2.protc_date ORDER BY t1.level_date DESC) AS rn
    FROM level_table t1
    INNER JOIN protocol_table t2 
        ON t1.id = t2.id 
        AND t1.level_date <= t2.protc_date
)
SELECT id, level_date, level, protc_date, protc
FROM ranked_levels
WHERE rn = 1;

如果存在多条level_date同为最大值的记录,需要保留所有匹配项的话,可将ROW_NUMBER()替换为RANK()。

方案二:关联子查询匹配最大日期

对protocol_table的每条记录,通过子查询直接找到同id下满足level_date <= protc_date的最大level_date,再关联level_table获取对应level值:

SELECT 
    t1.id,
    t1.level_date,
    t1.level,
    t2.protc_date,
    t2.protc
FROM protocol_table t2
INNER JOIN level_table t1 
    ON t1.id = t2.id 
    AND t1.level_date = (
        SELECT MAX(level_date)
        FROM level_table
        WHERE id = t2.id AND level_date <= t2.protc_date
    );

这个方案逻辑更直观,适合对窗口函数不熟悉的场景,但要注意:如果某个protocol_table记录对应的id在level_table中没有满足level_date <= protc_date的记录,会被INNER JOIN过滤掉,符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 07:47:30