Я попытался обновить в MSSQL столбец (Y) таблицы (A) с восходящей последовательностью, которая сбрасывается при изменении значения другого столбца (X) той же таблицы. Таблица А в начале:
| я бы | Икс | Д |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 1 |
| 3 | 2 | 1 |
| 4 | 2 | 1 |
| 5 | 2 | 1 |
| 6 | 3 | 1 |
Как и должно быть после скрипта:
| я бы | Икс | Д |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 1 |
| 4 | 2 | 2 |
| 5 | 2 | 3 |
| 6 | 3 | 1 |
Я пробовал с 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;
Да SELECT ROW_NUMBER() OVER(PARTITION BY X ORDER BY id) as row_num
Да, я неправильно пишу, у меня таблица чуть посложнее. SELECT ROW_NUMBER() OVER (Partition BY X ORDER BY "Id","C") AS row_num_Id , "C" , "Id" FROM dbo.A) AS sub но он меняется одинаково во всех рядах
Не думайте, что вам нужны Id и C в двойных кавычках, удалите двойные кавычки и посмотрите


Это даст вам желаемый результат
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. Я не очень часто использую CTE для обновления, поэтому ценю отзыв.
Отлично, работает так, как я хочу. Спасибо вам обоим
Вам нужен пункт
PARTITION BYв вашемOVER. Кроме того,OVER ( "Id" ASC)недействителен. ЭтоORDER BY "ID"?