Как обновить столбец, чтобы добавить автоматическое увеличение, используя значение MAX из столбца?

У меня есть примерно такая таблица:

CREATE TABLE #TempTable
(
    COLUMN1 INT,
    COLUMN2 INT
)

INSERT INTO #TempTable
  (
    COLUMN1,
    COLUMN2
  )
VALUES
  (1, 5),
  (2, 4),
  (3, NULL),
  (4, 2),
  (5, NULL)

Я хочу обновить COLUMN2, чтобы добавить автоматическое увеличение, используя значение MAX из столбца.

Я попробовал этот запрос:

DECLARE @maxNumber        INT = 0;
SELECT @maxNumber = ISNULL(MAX(COLUMN2), 0) + 1
FROM   #TempTable

SELECT @maxNumber

CREATE SEQUENCE [tempSqu] AS [int] START 
WITH @maxNumber INCREMENT BY 1

UPDATE #TempTable
SET    COLUMN2 = NEXT VALUE FOR [tempSqu]
WHERE  COLUMN2 IS NULL

DROP sequence [tempSqu]

Выход:

COLUMN1     COLUMN2
--------------------
1           5
2           4
3           6
4           2
5           7

person Tom    schedule 04.02.2020    source источник
comment
Можете ли вы включить ожидаемый результат после обновления в свой вопрос, чтобы он стал более ясным?   -  person Suraj Kumar    schedule 04.02.2020
comment
Что ты пытаешься сделать? Использование MAX+1 всегда приводит к созданию повторяющихся значений, если последние записи удаляются или изменяются. Вам также не нужна ПОСЛЕДОВАТЕЛЬНОСТЬ для получения возрастающих значений, вы можете использовать ROW_NUMBER() или любую другую функцию ранжирования, чтобы получить номер ранга для каждой строки.   -  person Panagiotis Kanavos    schedule 04.02.2020


Ответы (3)


Попробуйте что-то вроде этого:

UPDATE tmp
SET tmp.COLUMN2 = @maxNumber, @maxNumber = @maxNumber + 1
FROM #TempTable tmp
WHERE tmp.COLUMN2 IS NULL
person JohnMaxwell    schedule 04.02.2020
comment
Это самый простой и самый короткий ответ в соответствии с текущим требованием. - person Suraj Kumar; 04.02.2020

Вы можете сделать то же самое с динамическим SQL примерно так:

DECLARE @maxNumber INT = 0
    ,@sequenceDSQL VARCHAR(4000);

SELECT @maxNumber = ISNULL(MAX(COLUMN2), 0) + 1
FROM #TempTable

SET @sequenceDSQL = 'CREATE SEQUENCE [dbo].[tempSqu] AS [int] START WITH '
    + CAST(@maxNumber AS VARCHAR(19)) +
    'INCREMENT BY 1 UPDATE #TempTable
    SET COLUMN2 = NEXT VALUE FOR [tempSqu]
    WHERE COLUMN2 IS NULL
    DROP sequence [tempSqu]'

EXEC (@sequenceDSQL)
person Reza Jenabi    schedule 04.02.2020

Вы также можете попробовать с функцией Row_Number() и inner join update, как показано ниже.

Примечание. Я предоставил логику в комментарии к запросу.

CREATE TABLE TempTable
(
    COLUMN1     INT,
    COLUMN2     INT
)

INSERT INTO TempTable ( COLUMN1, COLUMN2 )
VALUES (1, 5), (2, 4), (3, NULL), (4, 2), (5, NULL), (6, 9), (7, NULL), (8, NULL)

--Getting the maximum value available in the table.
declare @maxValue int = (Select top 1 Column2 from TempTable 
          where Column2 is not null order by column2 desc)

Update 
     t set t.column2 = @maxValue + SrNo --Update with max value with SrNo as sequence 
from TempTable t inner join (
  SELECT COLUMN1
        ,row_number() OVER (
            ORDER BY (
                    SELECT NULL
                    )
            ) AS SRNO --It will always give value in sequence like 1, 2, 3, ...
    FROM TempTable where COLUMN2 is null
)temp on t.Column1 = temp.Column1 
where t.column2 is null

--Selecting the record after update
Select * from TempTable order by column1

Вот live db‹>скрипка.

введите здесь описание изображения

person Suraj Kumar    schedule 04.02.2020