如何在一定行数后重新启动Row_Number。
E.g。
如何转
ID RowNumber
-------------
100 1
101 2
102 3
125 4
126 5
148 6
149 7
150 8
151 9
INTO
ID RowNumber
-------------
100 1
101 2
102 3
125 4
126 1
148 2
149 3
150 4
151 1
请注意,无法根据ID进行分区,实际上是随机的。
我试过使用递归CTE并且非常接近。
此:
DECLARE @MyTable TABLE (ID INT, RowNumber INT)
INSERT INTO @MyTable (ID,RowNumber)
SELECT 100,1 UNION ALL
SELECT 101,2 UNION ALL
SELECT 102,3 UNION ALL
SELECT 125,4 UNION ALL
SELECT 126,5 UNION ALL
SELECT 148,6 UNION ALL
SELECT 149,7 UNION ALL
SELECT 150,8 UNION ALL
SELECT 151,9;
WITH CTE AS
(
SELECT ID,
RowNumber ,
1 AS Steps
FROM @MyTable
WHERE ID = 100
UNION ALL
SELECT M.ID ,
M.RowNumber +1,
CASE WHEN C.Steps = 4 THEN 0 ELSE C.Steps END +1 AS steps
FROM @MyTable M
INNER JOIN CTE C ON C.RowNumber = M.RowNumber
)
SELECT *
FROM CTE
返回:
ID RowNumber
-------------
100 1 1
100 2 2
101 3 3
102 4 4
125 5 1
126 6 2
148 7 3
149 8 4
150 9 1
151 10 2
与第一个ID非常接近。
任何帮助都会很棒。
谢谢,
威尔
答案 0 :(得分:10)
使用模运算符:
select id, rownumber, 1 + ((rownumber - 1) % 4)
from table t;
如果rownumber
不是列,您还可以使用row_number()
函数:
select id, row_number() over (order by id),
1 + ((row_number() over (order by id) - 1) % 4)
from table t;