0

Создал столбец со значением по умолчанию 0 для моей таблицы. Я хочу обновить эту таблицу с правильным порядковым номером. Могу ли я сделать это с помощью Row_Number?Обновить столбец на основе 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 
+0

Выбирает правильный оператор select –

ответ

3
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 BY и ORDER BY немного отличается, а затем использовать DENSE_RANK() вместо ROW_NUMBER() обрабатывать связи.