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

基于指示器(窗口函数)从另一列设置日期列值(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:35:18