Обновить столбец с помощью динамической последовательности с помощью Row_number()

Я попытался обновить в MSSQL столбец (Y) таблицы (A) с восходящей последовательностью, которая сбрасывается при изменении значения другого столбца (X) той же таблицы. Таблица А в начале:

я быИксД
111
211
321
421
521
631

Как и должно быть после скрипта:

я быИксД
111
212
321
422
523
631

Я пробовал с row_number(), но в цикле он изменяет все строки: Со счетчиком и переменной для увеличения:

UPDATE dbo.A
SET "Y" = @MyInc
FROM (
            SELECT ROW_NUMBER() OVER ( "Id" ASC) AS row_num_Id
             , Id
             , X
             , Y
        FROM dbo.A)     AS sub
        WHERE row_num_Id = @MyCounter;

Вам нужен пункт PARTITION BY в вашем OVER. Кроме того, OVER ( "Id" ASC) недействителен. Это ORDER BY "ID"?

Larnu 10.05.2022 11:21

Да SELECT ROW_NUMBER() OVER(PARTITION BY X ORDER BY id) as row_num

Andrew 10.05.2022 11:27

Да, я неправильно пишу, у меня таблица чуть посложнее. SELECT ROW_NUMBER() OVER (Partition BY X ORDER BY "Id","C") AS row_num_Id , "C" , "Id" FROM dbo.A) AS sub но он меняется одинаково во всех рядах

Jonathan 10.05.2022 12:17

Не думайте, что вам нужны Id и C в двойных кавычках, удалите двойные кавычки и посмотрите

Andrew 10.05.2022 12:29
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это даст вам желаемый результат

CREATE TABLE #T (
    Id INT NOT NULL, 
    X INT NOT NULL, 
    Y INT NOT NULL
)

INSERT INTO #T(Id, X, Y)
VALUES
(1, 1, 1),
(2, 1, 1),
(3, 2, 1),
(4, 2, 1),
(5, 2, 1),
(6, 3, 1);

GO

WITH WithRowNumbers AS (
    SELECT 
    Id, 
    X, 
    ROW_NUMBER() OVER (PARTITION BY X ORDER BY Id) As RowNumber
    FROM #T
)

UPDATE T 
SET Y = WRN.RowNumber
FROM WithRowNumbers AS WRN
INNER JOIN #T AS T ON T.Id = WRN.Id

SELECT * FROM #T

Или, как упоминает @CharlieFace, вы можете упростить еще больше, поскольку CTE похож на представление исходной таблицы.

UPDATE T 
SET Y = T.RowNumber
FROM WithRowNumbers AS T;

Нет необходимости в присоединении, вы можете обновить WithRowNumbers напрямую dbfiddle.uk/…

Charlieface 10.05.2022 13:56

Ааа, хорошо, спасибо @Charlieface. Я не очень часто использую CTE для обновления, поэтому ценю отзыв.

Andrew 10.05.2022 14:03

Отлично, работает так, как я хочу. Спасибо вам обоим

Jonathan 10.05.2022 14:56

Другие вопросы по теме