SQL Server 中实现遇ColA为70时自动递增的分组ID列方法
SQL Server实现按ColA=70触发分组编号递增方案
核心逻辑是用SUM() OVER()窗口累加函数,遇到ColA=70时累加1,其余时候累加0,得到的结果就是你需要的DesiredColumn值。
完整实现代码
1. 模拟测试表数据
-- 建测试表 CREATE TABLE #TestTable ( ColA INT, Date VARCHAR(10), RSN INT, ID VARCHAR(20) ); -- 插入样例数据 INSERT INTO #TestTable (ColA, Date, RSN, ID) VALUES (70, '0904', 2, '0904-2'), (71, '0904', 3, '0904-3'), (100, '0904', 4, '0904-4'), (70, '0904', 5, '0904-5');
2. 计算DesiredColumn的查询语句
注意你需要按实际业务的排序规则调整ORDER BY的字段,这里样例按RSN升序排序保证顺序和你给出的样例一致:
SELECT ColA, Date, RSN, ID, SUM(CASE WHEN ColA = 70 THEN 1 ELSE 0 END) OVER (ORDER BY RSN ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS DesiredColumn FROM #TestTable;
结果说明
执行以上查询得到的结果和你给出的样例完全匹配:
| ColA | Date | RSN | ID | DesiredColumn |
|---|---|---|---|---|
| 70 | 0904 | 2 | 0904-2 | 1 |
| 71 | 0904 | 3 | 0904-3 | 1 |
| 100 | 0904 | 4 | 0904-4 | 1 |
| 70 | 0904 | 5 | 0904-5 | 2 |
持久化存储该列的方案
如果需要把计算结果落到表中存储,可选择以下两种方式:
- 新增计算列:如果数据更新后需要自动同步值,可新增持久化计算列(仅适用于排序逻辑固定的场景)
- 批量更新:新增普通列后执行UPDATE语句批量写入值:
-- 新增列 ALTER TABLE #TestTable ADD DesiredColumn INT; -- 批量更新值 WITH CTE AS ( SELECT DesiredColumn, SUM(CASE WHEN ColA = 70 THEN 1 ELSE 0 END) OVER (ORDER BY RSN ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS CalcVal FROM #TestTable ) UPDATE CTE SET DesiredColumn = CalcVal;
内容的提问来源于stack exchange,提问作者Ujval Gandhi
相关产品推荐
相关产品推荐

