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

SQL Server批量获取各节点2019年首尾数据并更新激活标识

批量更新SQL Server中每个门店节点的2019年首尾记录激活标识

完全可以实现批量处理,不用逐个节点执行,CTE是非常合适的实现方式,也可以用子查询,下面是具体方案:

方案一:使用CTE + 窗口函数(推荐)

利用ROW_NUMBER()窗口函数按门店节点(NODE_ID)分组,分别对2019年的记录按日期升序、降序编号,编号为1的就是每个节点的第一条和最后一条记录,之后批量更新这些记录的激活标识。

WITH NodeRecords AS (
    SELECT 
        NODE_ID,
        DATE,
        active_flag,
        -- 按节点分组,日期升序排序,第一条记录编号为1
        ROW_NUMBER() OVER (PARTITION BY NODE_ID ORDER BY DATE ASC) AS rn_asc,
        -- 按节点分组,日期降序排序,第一条记录对应原表的最后一条记录
        ROW_NUMBER() OVER (PARTITION BY NODE_ID ORDER BY DATE DESC) AS rn_desc
    FROM NODES
    WHERE DATE BETWEEN '2019-01-01' AND '2019-12-31' -- 原查询的12/30建议改为12/31,确保覆盖全年数据
)
UPDATE NodeRecords
SET active_flag = 'Y'
WHERE rn_asc = 1 OR rn_desc = 1;

注意点:

  • 若同一节点在同一天有多条记录,可在ORDER BY中添加其他唯一字段(比如主键ID)来确保首尾记录的唯一性,例如ORDER BY DATE ASC, ID ASC
  • 执行UPDATE前,建议先运行SELECT * FROM NodeRecords WHERE rn_asc = 1 OR rn_desc = 1验证目标记录是否正确

方案二:使用子查询 + 聚合函数

如果业务允许同一节点在首尾日期的所有记录都被标记为'Y',可以用聚合函数先找出每个节点的最早和最晚日期,再关联原表更新:

UPDATE N
SET active_flag = 'Y'
FROM NODES N
INNER JOIN (
    SELECT 
        NODE_ID,
        MIN(DATE) AS first_date,
        MAX(DATE) AS last_date
    FROM NODES
    WHERE DATE BETWEEN '2019-01-01' AND '2019-12-31'
    GROUP BY NODE_ID
) T ON N.NODE_ID = T.NODE_ID AND (N.DATE = T.first_date OR N.DATE = T.last_date);

这种方式性能也不错,但如果同一节点在首尾日期有多个记录,会全部更新,适合业务允许这种场景的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 14:03:12