列集

时间:2018-02-05 10:45:08

标签: sql sql-server

短篇小说

我有'行'我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

4 个答案:

答案 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