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

