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
相关产品推荐
相关产品推荐

