【问题标题】:Update Column based on row_number根据 row_number 更新列
【发布时间】:2017-04-16 18:13:09
【问题描述】:

我为我的表创建了一个默认值为 0 的列。我想用正确的序列号更新该表。我可以用 Row_Number 做到这一点吗?

我的桌子是:

PersonID |  Code  |  Sequence Number
---------+--------+------------
10       | D112  |    0
10       | D112  |    0
10       | D112  |    0
10       | E110  |    0
10       | E110  |    0
10       | E110  |    0
10       | D112  |    0
10       | D112  |    0
10       | D112  |    0
10       | E110  |    0
10       | E110  |    0
10       | E110  |    0

我希望我的桌子是这样的:

PersonID |  Code  |  Sequence Number
---------+--------+------------
10       | D112  |    1
10       | D112  |    1
10       | D112  |    1
10       | E110  |    2
10       | E110  |    2
10       | E110  |    2
11       | M490  |    1
11       | M490  |    1
11       | M490  |    1
11       | N550  |    2
11       | N550  |    2
11       | N550  |    2

这是我拥有的代码,但不确定是否正确。

WITH CTE AS (
SELECT
    t.Sequence Number,
    ROW_NUMBER() OVER (PARTITION BY t.PersonID, t.Code ORDER BY t.PersonID) AS RN
FROM Table AS t )

UPDATE CTE 
SET Sequence Number = RN

【问题讨论】:

  • 看起来select语句是正确的

标签: sql sql-server sql-server-2012 common-table-expression row-number


【解决方案1】:
DECLARE @Table AS TABLE (PersonId INt, Code CHAR(4), SequenceNumber INT)

INSERT INTO @Table VALUES (10,'D112',0),(10,'D112',0),(10,'D112',0),(10,'E110',0)
,(10,'E110',0),(10,'E110',0),(10,'D112',0),(10,'D112',0),(10,'D112',0),(10,'E110',0)
,(10,'E110',0),(10,'E110',0)


;WITH CTE AS (
SELECT
    PersonId
    ,Code
    ,SequenceNumber
    ,DENSE_RANK() OVER (PARTITION BY t.PersonID ORDER BY t.Code ) AS RN
FROM
    @Table AS t)


UPDATE cte
    SET SequenceNumber = RN

SELECT *
FROm
    @Table

您非常接近,只需将PARTITION BYORDER BY 稍有不同,然后使用DENSE_RANK() 而不是ROW_NUMBER() 来处理关系。

【讨论】:

    猜你喜欢
    • 2015-08-10
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 2021-12-09
    • 2020-07-28
    • 2021-03-30
    相关资源
    最近更新 更多