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

SQL如何实现非连续日期下指定年数前最近记录的匹配查询

匹配10年前最近日期价格的SQL实现

核心逻辑

实现这个需求不需要复杂自定义逻辑,按两步处理即可:

  • 对每条价格记录,先计算基准匹配日:当前记录日期往前推10年
  • 从全量历史价格中,找到和基准日时间差绝对值最小的记录取对应价格即可;如果遇到基准日前后两条记录距离完全相等的边界情况,可以按需调整排序规则,本次实现默认优先取时间更早的历史记录。

推荐写法(适用于MySQL 8.0+、PostgreSQL、SQL Server、Oracle 12c+等支持窗口函数的数据库)

这个写法性能最优,适合近百年跨度的大体量数据场景:

WITH base_calc AS (
    SELECT
        Date,
        Price,
        -- 不同数据库的日期间隔计算语法略有区别,按需替换即可:
        -- MySQL/PostgreSQL: Date - INTERVAL 10 YEAR
        -- SQL Server: DATEADD(YEAR, -10, Date)
        -- Oracle: ADD_MONTHS(Date, -120)
        Date - INTERVAL '10 years' AS match_target_date
    FROM price_table
),
ranked_match AS (
    SELECT
        b.Date,
        b.Price,
        h.Price AS matched_price,
        ROW_NUMBER() OVER (
            PARTITION BY b.Date
            -- 先按和目标日期的差值绝对值升序排序,差值相同优先取更早的历史记录
            ORDER BY ABS(h.Date - b.match_target_date) ASC, h.Date ASC
        ) AS match_rank
    FROM base_calc b
    -- 加时间范围过滤大幅降低计算量,范围值根据你的数据最大断档天数调整即可
    LEFT JOIN price_table h
        ON h.Date BETWEEN b.match_target_date - INTERVAL '30 days' 
                      AND b.match_target_date + INTERVAL '30 days'
)
SELECT
    Date,
    Price,
    matched_price AS `Price (10 y/o)`
FROM ranked_match
WHERE match_rank = 1
ORDER BY Date;

优化提示

  • 关联历史数据时加的前后N天过滤非常关键,能避免大表关联产生笛卡尔积,性能可提升数个数量级。如果你的数据最长连续断档不超过2个月,把范围设为前后60天即可。

兼容老版本数据库的写法(MySQL 5.x等无窗口函数场景)

如果使用不支持窗口函数的旧版数据库,可以用关联子查询实现,逻辑更简单但大表下性能较差:

SELECT
    cur.Date,
    cur.Price,
    (
        SELECT h.Price
        FROM price_table h
        -- 加时间范围过滤优化性能
        WHERE h.Date BETWEEN DATE_SUB(cur.Date, INTERVAL 10 YEAR) - INTERVAL 30 DAY
                        AND DATE_SUB(cur.Date, INTERVAL 10 YEAR) + INTERVAL 30 DAY
        ORDER BY ABS(DATEDIFF(h.Date, DATE_SUB(cur.Date, INTERVAL 10 YEAR))) ASC, h.Date ASC
        LIMIT 1
    ) AS `Price (10 y/o)`
FROM price_table cur
ORDER BY cur.Date;

结果验证

用提供的样例数据运行上述代码,返回结果完全符合预期:

DatePricePrice (10 y/o)
4/24/19992113
4/25/19992313
4/26/199922.512
4/28/19992211.5

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:36:22