小编典典

N后重新启动T-SQL行号

sql

在一定数量的行之后,如何重新启动我的Row_Number。

例如

我该怎么转

ID  RowNumber
-------------
100 1
101 2
102 3
125 4
126 5
148 6
149 7
150 8
151 9

进入

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距离很近。

任何帮助将是巨大的。

谢谢,

将要


阅读 190

收藏
2021-03-23

共1个答案

小编典典

使用模运算符:

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;
2021-03-23