生成特定计数模式:第1-5行递增,第6-7行保持不变
实现特定循环计数模式的SQL解决方案
需求为生成特定计数模式:行编号i按1-7循环重复,仅当i=1、2、3、4、5时计数值递增,i=6、7时计数值保持与同组i=5的数值一致。
原代码
WITH RECURSIVE numbers(pk) AS ( SELECT 1 UNION ALL SELECT pk + 1 FROM numbers WHERE pk < 27 ) SELECT pk, (row_number() over (order by pk asc) -1) %7 +1 as i, (case when pk%7 =5 then pk when pk%7 =6 then pk-1 when pk%7 = 0 then pk-2 else pk end) as p FROM numbers;
原代码无法满足需求,例如第8行计数值应为6而非8,需调整逻辑。
修正后的SQL代码
WITH RECURSIVE numbers(pk) AS ( SELECT 1 UNION ALL SELECT pk + 1 FROM numbers WHERE pk < 27 ) SELECT pk, (row_number() OVER (ORDER BY pk ASC) - 1) % 7 + 1 AS i, FLOOR((pk - 1) / 7) * 5 + LEAST((row_number() OVER (ORDER BY pk ASC) - 1) % 7 + 1, 5) AS p FROM numbers;
逻辑说明
- 递归CTE
numbers生成1到27的连续序列pk i的计算保持原逻辑,实现1-7循环编号p的计算分为两部分:FLOOR((pk - 1)/7)*5:计算当前组之前累计的计数值,每组贡献5个递增数LEAST(...,5):限制组内计数值最大为5,确保i=6、7时与同组i=5的数值一致
预期结果
| pk | 行号i | 目标计数值p |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 3 | 3 |
| 4 | 4 | 4 |
| 5 | 5 | 5 |
| 6 | 6 | 5 |
| 7 | 7 | 5 |
| 8 | 1 | 6 |
| 9 | 2 | 7 |
| 10 | 3 | 8 |
| 11 | 4 | 9 |
| 12 | 5 | 10 |
| 13 | 6 | 10 |
| 14 | 7 | 10 |
| 15 | 1 | 11 |
| 16 | 2 | 12 |
| 17 | 3 | 13 |
| 18 | 4 | 14 |
| 19 | 5 | 15 |
| 20 | 6 | 15 |
| 21 | 7 | 15 |
| 22 | 1 | 16 |
| 23 | 2 | 17 |
| 24 | 3 | 18 |
| 25 | 4 | 19 |
| 26 | 5 | 20 |
| 27 | 6 | 20 |
内容的提问来源于stack exchange,提问作者StackOne
相关产品推荐
相关产品推荐

