SQL Server:如何从另一张表获取指定日期前后各2个时间戳
解决方案
假设两张表的结构如下(可根据实际业务调整列名):
- Table1:存储待筛选的时间戳数据,核心列如
event_timestamp(datetime类型) - Table2:存储指定的目标日期,核心列如
target_date(datetime类型,即你提到的粉色高亮内容)
可以通过关联表+窗口函数+子查询实现需求,全程无需CTE,兼容Tableau:
-- 筛选目标日期之前的最近2个时间戳 SELECT t1.event_timestamp, t2.target_date FROM ( SELECT t1.event_timestamp, t2.target_date, ROW_NUMBER() OVER (PARTITION BY t2.target_date ORDER BY t1.event_timestamp DESC) AS rn_before FROM Table1 t1 JOIN Table2 t2 ON t1.event_timestamp <= t2.target_date ) sub_before WHERE rn_before <= 2 UNION ALL -- 筛选目标日期之后的最近2个时间戳 SELECT t1.event_timestamp, t2.target_date FROM ( SELECT t1.event_timestamp, t2.target_date, ROW_NUMBER() OVER (PARTITION BY t2.target_date ORDER BY t1.event_timestamp ASC) AS rn_after FROM Table1 t1 JOIN Table2 t2 ON t1.event_timestamp >= t2.target_date ) sub_after WHERE rn_after <= 2 -- 可选:若需去重(比如目标日期恰好等于某个时间戳,会在前后结果中重复出现) ORDER BY target_date, event_timestamp;
关键说明
- 用
UNION ALL拆分“取前2个”和“取后2个”的逻辑,避免CTE嵌套 PARTITION BY t2.target_date确保每个目标日期独立计算对应的前后时间戳顺序ROW_NUMBER()用来给每个目标日期关联的时间戳排序,精准筛选出最近的2条- 如果Table2的
target_date是纯日期类型(不带时分秒),可通过CAST(t2.target_date AS datetime)转换后再关联,保证时间匹配逻辑准确
内容的提问来源于stack exchange,提问作者Willie
相关产品推荐
相关产品推荐

