SQL中如何创建满4个值自动重置的循环计数列
SQL实现1-4循环列生成方案
核心实现逻辑
要基于从1开始连续递增的整数列,生成按1、2、3、4循环排列的第二列,核心是利用整数取模运算处理循环边界,最简洁的通用计算公式为:(递增列值 - 1) % 4 + 1
逻辑说明:将递增列值先减1,对4取模后会得到0、1、2、3的循环序列,再加1就能转换为1、2、3、4的目标循环序列,避免了直接取模时4的倍数返回0的问题。
场景1:现有表已有连续递增列的查询实现
假设你的表名为target_table,已有的从1开始递增的列名为id,直接执行如下查询即可得到预期结果:
SELECT id, (id - 1) % 4 + 1 AS cycle_value FROM target_table ORDER BY id;
场景2:无现成表,直接生成目标序列
如果需要直接生成符合规则的测试数据,可以用标准递归CTE写法(兼容MySQL 8.0+、PostgreSQL、SQL Server、Spark SQL等绝大多数支持SQL:1999标准的数据库),示例生成前15行数据:
WITH RECURSIVE sequence AS ( -- 递归起点:第一行值为1 SELECT 1 AS id UNION ALL -- 递归逐行+1,直到达到设定的最大值,此处示例最大值为15,可按需修改 SELECT id + 1 FROM sequence WHERE id < 15 ) SELECT id, (id - 1) % 4 + 1 AS cycle_value FROM sequence;
执行上述代码后返回的结果和需求给出的示例完全一致:
id | cycle_value ---|------------ 1 | 1 2 | 2 3 | 3 4 | 4 5 | 1 6 | 2 7 | 3 8 | 4 9 | 1 10 | 2 11 | 3 12 | 4 13 | 1 14 | 2 15 | 3
可选替代写法
如果不习惯用(x-1)%4+1的偏移写法,也可以用CASE判断处理取模为0的场景,效果完全相同:
SELECT id, CASE WHEN id % 4 = 0 THEN 4 ELSE id % 4 END AS cycle_value FROM target_table;
内容的提问来源于stack exchange,提问作者Tyler D
相关产品推荐
相关产品推荐

