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

MySQL周数据对比查询:日期缺失时取此前最近记录实现方法

解决方案

你不需要依赖daynr字段,直接通过日期字段的范围匹配+最大值筛选就能实现需求,核心逻辑是:先算出每个交易标的最新日期减7天的目标截止日,再匹配该标的所有日期早于等于截止日的记录,取其中日期最新的一条即可。

通用兼容写法(所有MySQL版本支持)

该写法不需要窗口函数支持,兼容性最好:

SELECT 
    m.symbol,
    m.date,
    m.trend,
    m.duration,
    m.price_quote
FROM (
    SELECT 
        symbol,
        MAX(date) - INTERVAL 7 DAY AS target_cutoff
    FROM market_trend_record
    GROUP BY symbol
) AS latest_calc
INNER JOIN market_trend_record m
    ON m.symbol = latest_calc.symbol
WHERE m.date = (
    SELECT MAX(sub.date)
    FROM market_trend_record sub
    WHERE sub.symbol = latest_calc.symbol
      AND sub.date <= latest_calc.target_cutoff
);

窗口函数简化写法(MySQL 8.0+ / PostgreSQL 等支持窗口函数的数据库适用)

如果你的数据库版本支持窗口函数,代码更简洁,执行效率更高:

WITH base_calc AS (
    SELECT
        symbol,
        date,
        trend,
        duration,
        price_quote,
        ROW_NUMBER() OVER (
            PARTITION BY symbol
            ORDER BY CASE 
                WHEN date <= MAX(date) OVER (PARTITION BY symbol) - INTERVAL 7 DAY 
                THEN date 
            END DESC
        ) AS record_rank
    FROM market_trend_record
)
SELECT symbol, date, trend, duration, price_quote
FROM base_calc
WHERE record_rank = 1;

关于daynr字段的使用说明

用daynr字段确实也能实现相同逻辑:先取每个标的最新记录的daynr,计算7天前对应的目标daynr值,再取小于等于目标值的最大daynr对应的记录即可。但这种方式相比直接操作日期字段没有优势,反而需要额外确认daynr的计数规则是否和自然日偏移完全对齐,容易引入计算错误,不推荐使用。

以你提供的FTSE 100样例数据验证:标的最新日期为2022-06-10,计算得到截止日为2022-06-03,筛选该日期前的最新记录会命中2022-06-01的数据,完全符合预期。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 18:33:34