sql - T-SQL 行号在 N 后重新启动

标签 sql sql-server tsql

如何在一定数量的行后重新启动我的 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 非常接近。

任何帮助都会很棒。

谢谢,

最佳答案

使用模运算符:

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;

关于sql - T-SQL 行号在 N 后重新启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27538952/

相关文章:

java - 为什么我需要一个连接来创建 PreparedStatements?

sql - SQL Server 中的字母数字序列

sql-server - 如果我选择 RavenDB,我会失去 SQL Server 的哪些优势?

当包含执行计划时,SSMS 中的 SQL Server 查询速度更快

php - 如何在 PHP 中解密由 SQL Server 的 EncryptByPassPhrase() 加密的字符串?

sql - 从没有主键的 SQL 表中删除重复记录

java - Hibernate中根据条件切换表

sql - 如何向具有自增主键的表中插入值?

python - 表格中的文字?

sql - 如何在T-SQL中翻转位域?