基于指示器(窗口函数)从另一列设置日期列值(SQL Server托管实例)
解决SQL Server中marketCalendar表PrevMktOpenDate列赋值问题
需求是将PrevMktOpenDate列设置为当前行日期之前最近一次MarketOpen=1对应的CalendarDate。以下是两种可行的实现方式:
方法一:窗口函数分组(高性能推荐)
通过分组标记连续的非开市日,再关联获取每组对应的最近开市日期:
WITH MarketGroups AS ( SELECT Day, CalendarDate, MarketOpen, -- 每遇到一个开市日,组号递增,非开市日继承前序组号 SUM(CASE WHEN MarketOpen = 1 THEN 1 ELSE 0 END) OVER (ORDER BY CalendarDate ROWS UNBOUNDED PRECEDING) AS GroupId FROM marketCalendar ), GroupOpenDates AS ( SELECT GroupId, -- 提取每组内的最新开市日期 MAX(CASE WHEN MarketOpen = 1 THEN CalendarDate END) AS LastOpenDate FROM MarketGroups GROUP BY GroupId ) UPDATE mc SET mc.PrevMktOpenDate = god.LastOpenDate FROM marketCalendar mc JOIN MarketGroups mg ON mc.CalendarDate = mg.CalendarDate JOIN GroupOpenDates god ON mg.GroupId = god.GroupId;
方法二:子查询方式(逻辑直观)
直接为每行查询其日期之前的最大开市日期,适合小数据量场景:
UPDATE mc SET PrevMktOpenDate = ( SELECT MAX(CalendarDate) FROM marketCalendar WHERE CalendarDate < mc.CalendarDate AND MarketOpen = 1 ) FROM marketCalendar mc;
效果验证
对比示例数据:
- 2023-01-01、2023-01-02这两个非开市日,会正确关联到最近的2022-12-30(开市日)
- 2023-01-03(开市日)会关联到2022-12-30
- 2023-01-04(开市日)会关联到前一天的2023-01-03
完全匹配期望结果。
内容的提问来源于stack exchange,提问作者TylerJSimpson
相关产品推荐
相关产品推荐

