2014-12-18 3 views
0

Как перезапустить мой Row_Number после определенного количества строк.Номер строки строки T-SQL после N

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.

Любая помощь будет отличной.

Спасибо,

Will

ответ

7

Используйте оператор по модулю:

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; 
+0

Ах, что идеально! Настолько проще спасибо! –

Смежные вопросы