Обновите T- SQL с последовательной нумерацией, начиная с указанного c номера и порядка сначала по другому столбцу - PullRequest
0 голосов
/ 08 января 2020

Я на SQL Server 2014 с этим.

Какой самый быстрый способ обновить столбец с определенными значениями (где ID = 0), начиная с указанного значения c ( наибольший + 1 из того же столбца) И упорядоченный первым в другом столбце (отметка времени)?

Вот данные:

       ID  timestamp
    -------------------------------
 1    101  2020-01-01 11:02:14.235
 2    102  2020-01-01 12:05:04.123
 3    103  2020-01-01 13:20:50.457
 4    104  2020-01-01 14:20:53.447
 5    105  2020-01-01 15:25:25.125
 6      0  2020-01-01 16:25:14.447
 7      0  2020-01-02 20:26:01.147
 8      0  2020-01-01 17:18:39.987
 9      0  2020-01-01 19:14:14.014
10      0  2020-01-01 18:10:10.000

Вот как это должно получиться:

     ID  timestamp
 -------------------------------
 1  101  2020-01-01 11:02:14.235
 2  102  2020-01-01 12:05:04.123
 3  103  2020-01-01 13:20:50.457
 4  104  2020-01-01 14:20:53.447
 5  105  2020-01-01 15:25:25.125
 6  106  2020-01-01 16:25:14.447
 8  107  2020-01-01 17:18:39.987
10  108  2020-01-01 18:10:10.000
 9  109  2020-01-01 19:14:14.014
 7  110  2020-01-02 20:26:01.147

Итак, сначала упорядочите по метке времени, затем заполните числа. Желательно не использовать курсор или временную таблицу ради скорости (это много таблиц и много баз данных).

1 Ответ

2 голосов
/ 08 января 2020

Обновляемый CTE, использующий ROW_NUMBER и оконный MAX для получения новых значений идентификатора, может показаться наиболее простым решением:

CREATE TABLE dbo.YourTable (ID int,
                            [timestamp] datetime2(3)); --This is a bad name for a column, as timestamp is a synonym for rowversion

INSERT INTO dbo.YourTable (ID, [timestamp])
VALUES (101,'2020-01-01T11:02:14.235'),
       (102,'2020-01-01T12:05:04.123'),
       (103,'2020-01-01T13:20:50.457'),
       (104,'2020-01-01T14:20:53.447'),
       (105,'2020-01-01T15:25:25.125'),
       (  0,'2020-01-01T16:25:14.447'),
       (  0,'2020-01-02T20:26:01.147'),
       (  0,'2020-01-01T17:18:39.987'),
       (  0,'2020-01-01T19:14:14.014'),
       (  0,'2020-01-01T18:10:10.000');
GO
WITH CTE AS(
    SELECT ID,
           ROW_NUMBER() OVER (PARTITION BY CASE ID WHEN 0 THEN 0 END ORDER BY [timestamp]) + MAX(ID) OVER () AS NewID
    FROM dbo.YourTable)
UPDATE CTE
SET ID = NewID
WHERE ID = 0;
GO

SELECT *
FROM dbo.YourTable;
GO

Примечание. Как число, которое вы если слева от ваших данных нет столбца, то «порядок» ваших данных будет потерян; но тогда он не был сохранен в первую очередь, поскольку only способ гарантировать порядок данных в СУБД - это ORDER BY, который создает уникальный «набор» для каждой строки.

...