Oracle中是否存在等效于Python pd.merge_asof的日期匹配函数
Oracle实现类似pandas pd.merge_asof的日期匹配方案
Oracle没有直接对标pd.merge_asof的内置函数,但可以通过关联+窗口排序函数的组合逻辑实现同ID下最接近日期的匹配需求。
实现逻辑
- 先将A1和A2表通过ID做等值关联,仅保留同ID的记录配对
- 计算每对同ID记录的A1日期和A2日期的差值绝对值
- 用窗口函数
ROW_NUMBER()按ID分组,按日期差值升序排序,取每组排序第一的记录即为最接近的匹配项
示例代码
WITH matched_pairs AS ( SELECT a1.ID AS ID, a1."Date" AS Date, a2.ID AS ID2, a2."Date" AS Date2, -- 计算两个日期的差值绝对值 ABS(TO_DATE(a1."Date", 'MM/DD/YYYY') - TO_DATE(a2."Date", 'MM/DD/YYYY')) AS date_diff, -- 按ID分组,按日期差值升序排序,差值最小的排第一 ROW_NUMBER() OVER (PARTITION BY a1.ID ORDER BY ABS(TO_DATE(a1."Date", 'MM/DD/YYYY') - TO_DATE(a2."Date", 'MM/DD/YYYY')) ASC) AS rn FROM A1 INNER JOIN A2 ON A1.ID = A2.ID ) SELECT ID, Date, ID2, Date2 FROM matched_pairs WHERE rn = 1;
结果说明
针对你给出的测试数据:
- A1中ID=3的两个日期分别是09/09/2021、10/12/2021
- A2中ID=3的日期是09/12/2021
两个日期差值分别为3天、30天,排序后取rn=1的记录即可得到你预期的输出结果。
如果需要严格匹配早于/等于A2日期的最近记录(对应
pd.merge_asof的默认direction='backward'行为),可以把ORDER BY部分修改为:ORDER BY CASE WHEN TO_DATE(a1."Date", 'MM/DD/YYYY') <= TO_DATE(a2."Date", 'MM/DD/YYYY') THEN 0 ELSE 1 END ASC, ABS(TO_DATE(a1."Date", 'MM/DD/YYYY') - TO_DATE(a2."Date", 'MM/DD/YYYY')) ASC
内容的提问来源于stack exchange,提问作者Mohsin ALvi
相关产品推荐
相关产品推荐

