Повторная последовательность набора данных в SQL Server - PullRequest
3 голосов
/ 13 октября 2009

У меня есть таблица значений, подобная этой:

CREATE TABLE 
(
    Name1 VARCHAR (50),
    Name2 VARCHAR (50),
    Sequence INT
)

В этой таблице у меня есть такие строки

'Bob', 'Jones', 1
'James','Ant', 2

Мне нужен лучший способ ОБНОВИТЬ (UPDATE SET) последовательность, основанную на порядке, скажем, столбца Name2, поэтому при повторной последовательности значения:

'James','Ant', 1
'Bob', 'Jones', 2

Я почти уверен, что это можно сделать с помощью стиля CTE ROW_NUMBER OVER (), но не уверен в точном синтаксисе.

Ответы [ 4 ]

6 голосов
/ 13 октября 2009

Вы можете обновить CTE:

WITH OrderedT AS
(
  SELECT Sequence, 
  ROW_NUMBER() OVER (ORDER BY Name2, Name1) as rn
  FROM T
)
UPDATE OrderedT
SET Sequence = rn;
4 голосов
/ 13 октября 2009

Как насчет этого:

WITH OrderedByName AS
(
  SELECT Name1, Name2, 
  ROW_NUMBER() OVER(ORDER BY Name2, Name1) as 'RowNum'
  FROM YourTable
)
UPDATE YourTable
SET Sequence = obn.RowNum
FROM OrderedByName obn
WHERE obn.Name1 = YourTable.Name1 
  AND obn.Name2 = YourTable.Name2

Марк

1 голос
/ 13 октября 2009

вам не нужно использовать CTE, производная таблица будет работать, попробуйте это:

create table abc 
(
    Name1 VARCHAR (50),
    Name2 VARCHAR (50),
    Sequence INT
)

insert into abc values ('Bob', 'Jones', 1
)
insert into abc values ('James','Ant', 2
)

SELECT * FROM abc ORDER BY Sequence

UPDATE a
    SET Sequence=dt.Rank
    FROM abc a
        INNER JOIN (SELECT
                        Name1, Name2 
                            ,ROW_NUMBER() OVER(ORDER BY Name2, Name1,Sequence) AS Rank
                     FROM abc
                   ) dt ON a.Name1=dt.Name1 AND a.Name2=dt.Name2

SELECT * FROM abc ORDER BY Sequence

ВЫВОД:

Name1               Name2    Sequence
------------------- -------- -----------
Bob                 Jones    1
James               Ant      2

(2 row(s) affected)

(2 row(s) affected)

Name1               Name2    Sequence
------------------- -------- -----------
James               Ant      1
Bob                 Jones    2

(2 row(s) affected)
0 голосов
/ 13 октября 2009

В ответ на решение KM - MS SQL старше 2005 года не поддерживает ROW_NUMBER ().

...