短篇小说
我有'行'我Requests
的表格。目前,当我向请求添加新行时,无法对其进行排序,因此我添加了Index
列。这样就可以添加新行并按照我的意愿对它们进行排序。
我想做什么
我想通过Index
编写MSSQL脚本,将设置旧行的默认值设置为InvoiceRequestId
(0,1,2)。目前应该按原样设置(Id
订单)。
当前表格
Id InvoiceRequestId Index
2734 620 0
2735 620 0
2736 621 0
2737 622 0
2738 622 0
2739 622 0
...
我想要实现的目标
Id InvoiceRequestId Index
2734 620 0
2735 620 1
2736 621 0
2737 622 0
2738 622 1
2739 622 2
...
修改
我看到,有些人开始只为那些行发布答案。这应该是一般的解决方案,我的不好,我之前没有澄清过这个问题。
解决方案
感谢下面的答案和本主题SQL Update with row_number(),我找到了以下解决方案:
With IndexUpdate As
(
SELECT [Index],
ROW_NUMBER() OVER (PARTITION BY InvoiceRequestID ORDER BY ID) -1 as RN
FROM [InvoiceRequestRows]
)
UPDATE IndexUpdate SET [Index]=RN
答案 0 :(得分:2)
您可以使用row_number()
功能
select *,
(row_number() over(partition by InvoiceRequestId order by Id)-1)
from table
编辑:使用CTE
作为子查询结果集,以便使用新创建的索引更新索引
;with cte as
(
select *,
(row_number() over(partition by InvoiceRequestId order by Id)-1) newindex
from table
)
update t set t.[Index] = c.newindex
from cte c
join table t on t.Id = c.Id
答案 1 :(得分:2)
如果你想获得这些结果,你不需要添加一列,你可以使用ROW_NUMBER函数,例如。
DECLARE @table TABLE(Id INT, InvoiceRequestId INT);
INSERT INTO @table
VALUES
(2734, 620),
(2735, 620),
(2736, 621),
(2737, 622),
(2738, 622),
(2739, 622);
SELECT Id,
InvoiceRequestId,
ROW_NUMBER() OVER(PARTITION BY InvoiceRequestId ORDER BY Id) AS [Index]
FROM @table;
会给你:
Id InvoiceRequestId Index
2734 620 1
2735 620 2
2736 621 1
2737 622 1
2738 622 2
2739 622 3
它从1开始计数而不是0,但结果是相同的。如果需要,可以添加“-1”为
如果您仍想添加该列,则可以使用相同的函数构建临时表并从那里插入
答案 2 :(得分:2)
您可以使用SQL Server中的RANK
函数之一来创建名为NewIndex
的新列,例如
链接here
SELECT ID, InvoiceRequestID,
ROW_NUMBER() OVER (PARTITION BY InvoiceRequestID ORDER BY ID) -1 AS NewIndex
FROM SomeTable
要更新Index
列,您可以使用此功能(尽管我尚未测试此代码...)
UPDATE SomeTable
SET [Index] = ROW_NUMBER() OVER (PARTITION BY InvoiceRequestID ORDER BY ID) -1
答案 3 :(得分:2)
以下查询应该有效。当你正在寻找从0开始的索引时,ROW_NUMBER -1正在完成。
WITH Requests as (
select * from (values
(2734 , 620 , 0)
,(2735, 620 , 0)
,(2736, 621 , 0)
,(2737 , 622 , 0)
,(2738, 622 , 0)
,(2739, 622 , 0)
) t (Id, InvoiceRequestId , [Index])
)
SELECT Id, InvoiceRequestId,(ROW_NUMBER()
OVER(PARTITION BY InvoiceRequestId
ORDER BY Id, InvoiceRequestId ASC)-1) AS Index
FROM Requests
您将获得如下输出。
Id InvoiceRequestId Index
2734 620 0
2735 620 1
2736 621 0
2737 622 0
2738 622 1
2739 622 2
要更新回来,您可以使用以下查询
UPDATE R
SET R.[Index] = N.[Index]
FROM Requests R
INNER JOIN
(
SELECT Id, InvoiceRequestId,(ROW_NUMBER()
OVER(PARTITION BY InvoiceRequestId
ORDER BY Id, InvoiceRequestId ASC)-1) AS [Index]
FROM Requests
) N
ON N.Id = R.ID AND N.InvoiceRequestId= R.InvoiceRequestId