SQL Server 2014:无需CASE表达式按每3个唯一ID分组设置groupid
解决方案
针对SQL Server 2014(v12.0.6108.1)版本,无需硬编码CASE表达式,可通过数学计算自动生成分组ID,完美适配id持续增长的场景,以下提供两种可行方案:
方案1:整数除法计算
利用整数除法特性,将id值偏移后除以分组大小(此处每组覆盖3个连续id区间),直接得到分组ID:
SELECT id, (id + 2) / 3 AS groupid FROM table_name
原理:通过id + 2让区间起始值对齐到3的倍数,整数除法自动完成分组:
- 1-3 → (1+2)/3=1,(3+2)/3=1(整数除法舍去小数部分)
- 4-6 → (4+2)/3=2,(6+2)/3=2
- 后续增长的id会自动归入对应分组,无需修改代码
方案2:CEILING函数计算
通过CEILING函数对id除以分组大小的结果向上取整,得到分组ID:
SELECT id, CEILING(id / 3.0) AS groupid FROM table_name
原理:将id转为浮点数后除以3,向上取整即可匹配对应分组:
- 1-3 → 1/3≈0.333,CEILING后为1;3/3=1,CEILING后为1
- 4-6 →4/3≈1.333,CEILING后为2;6/3=2,CEILING后为2
- 新增id如10→10/3≈3.333,CEILING后为4,完全符合预期
执行结果验证
两种方法执行后均会得到预期分组结果:
| id | groupid |
|---|---|
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 4 | 2 |
| 5 | 2 |
| 6 | 2 |
| 6 | 2 |
| 7 | 3 |
| 7 | 3 |
| 7 | 3 |
| 8 | 3 |
| 9 | 3 |
| 9 | 3 |
| 10 | 4 |
内容的提问来源于stack exchange,提问作者Jefflee0915
相关产品推荐
相关产品推荐

