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

如何在SQL Server中按两个规则关联两张分时数据表?

修正SQL Server中30分钟与15分钟K线表的关联查询

问题分析

你当前的查询出现重复行、roc字段值不符合预期,核心原因是没对匹配的30分钟记录做唯一筛选,或是时间关联条件不够严谨,导致一条15分钟记录匹配了多条30分钟记录,且没有取到符合要求的那条。

解决方案

使用ROW_NUMBER()窗口函数,对每个15分钟记录的匹配结果按时间差排序,只保留第一条符合条件的30分钟记录:

WITH Ranked30minMatches AS (
    SELECT 
        t15.*,
        t30.roc_1,
        t30.roc_2,
        -- 计算两条记录的时间差(分钟)
        DATEDIFF(MINUTE, t30.DateTime, t15.DateTime) AS time_diff,
        -- 按15分钟记录分组,时间差从小到大排名,确保取最接近的匹配项
        ROW_NUMBER() OVER (
            PARTITION BY t15.DateTime 
            ORDER BY DATEDIFF(MINUTE, t30.DateTime, t15.DateTime) ASC
        ) AS match_rank
    FROM 
        AAPL_265598_15min t15
    LEFT JOIN 
        AAPL_265598_30min t30 
        ON t30.DateTime <= t15.DateTime 
        AND DATEDIFF(MINUTE, t30.DateTime, t15.DateTime) <= 30
)
-- 只保留每个15分钟记录的第一条匹配结果
SELECT 
    DateTime,
    -- 替换成你需要的15分钟表其他字段
    Open, High, Low, Close,
    roc_1,
    roc_2
FROM 
    Ranked30minMatches
WHERE 
    match_rank = 1;

关键说明

  • 时间关联条件:t30.DateTime <= t15.DateTime AND DATEDIFF(...) <=30 严格确保30分钟记录的时间早于等于15分钟记录,且时间差不超过30分钟
  • 去重与筛选:PARTITION BY t15.DateTime 保证每个15分钟记录只对应一条30分钟记录;ORDER BY time_diff ASC 确保取时间最接近的匹配项(如果你的“第一条”指最早的30分钟记录,可改为ORDER BY t30.DateTime ASC)
  • 适配特殊场景:如果15分钟表存在重复的DateTime,需在PARTITION BY后添加唯一标识字段(比如主键),避免分组错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 06:35:01