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

Oracle SQL:关联日期列后获取符合条件的最大日期

问题分析与解决方案

你的SQL之所以返回两条记录,核心原因是GROUP BY子句包含了TABLE2.REQUESTED_DATE——数据库会按这个字段的不同值进行分组,只要REQUESTED_DATE存在差异,就会生成独立的分组,即使使用MAX()聚合也无法合并结果。

要实现"筛选出小于PURCHASE_DATE的最大REQUIRED_DATE"的需求,以下是几种可行的Oracle SQL方案:

方案一:子查询定位最大日期后关联

通过子查询先找到符合条件的最大REQUIRED_DATE,再关联TABLE2获取对应字段值:

SELECT
    t1.BUYER,
    t1.PURCHASE_ORDER,
    t1.PURCHASE_DATE,
    t2.REQUESTED_DATE,
    t2.REQUIRED_DATE
FROM TABLE1 t1
LEFT JOIN TABLE2 t2 
    ON t2.REQUIRED_DATE = (
        SELECT MAX(REQUIRED_DATE) 
        FROM TABLE2 
        WHERE REQUIRED_DATE < t1.PURCHASE_DATE
    )

方案二:使用Oracle特有的KEEP子句聚合

如果需要同时获取最大REQUIRED_DATE对应的REQUESTED_DATE,可以用KEEP子句在聚合时锁定对应值,避免按TABLE2字段分组:

SELECT
    t1.BUYER,
    t1.PURCHASE_ORDER,
    t1.PURCHASE_DATE,
    MAX(t2.REQUESTED_DATE) KEEP (DENSE_RANK LAST ORDER BY t2.REQUIRED_DATE) REQUESTED_DATE,
    MAX(t2.REQUIRED_DATE) REQUIRED_DATE
FROM TABLE1 t1
LEFT JOIN TABLE2 t2 ON t1.PURCHASE_DATE > t2.REQUIRED_DATE
GROUP BY
    t1.BUYER,
    t1.PURCHASE_ORDER,
    t1.PURCHASE_DATE

方案三:窗口函数筛选排名第一的记录

用窗口函数给符合条件的REQUIRED_DATE排序,只保留排名最高的记录:

SELECT
    BUYER,
    PURCHASE_ORDER,
    PURCHASE_DATE,
    REQUESTED_DATE,
    REQUIRED_DATE
FROM (
    SELECT
        t1.BUYER,
        t1.PURCHASE_ORDER,
        t1.PURCHASE_DATE,
        t2.REQUESTED_DATE,
        t2.REQUIRED_DATE,
        RANK() OVER (PARTITION BY t1.BUYER, t1.PURCHASE_ORDER ORDER BY t2.REQUIRED_DATE DESC) rnk
    FROM TABLE1 t1
    LEFT JOIN TABLE2 t2 ON t1.PURCHASE_DATE > t2.REQUIRED_DATE
)
WHERE rnk = 1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 13:50:21