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

