Itzik Ben-Gan The Last non NULL Puzzle.
: db < >
CREATE TABLE
(
Sequence_ID integer NULL,
Dex_ID integer PRIMARY KEY
);
INSERT
(Sequence_ID, Dex_ID)
VALUES
(1, 1),
(NULL, 2),
(NULL, 3),
(2, 4),
(NULL, 5),
(NULL, 6),
(3, 7),
(NULL, 8),
(NULL, 9),
(4, 10),
(NULL, 11),
(NULL, 12),
(3, 13),
(NULL, 14),
(NULL, 15);
WITH
Grouped AS
(
SELECT
T.Sequence_ID,
T.Dex_ID,
TargetDex_ID =
MAX(IIF(T.Sequence_ID IS NULL, NULL, T.Dex_ID)) OVER (
ORDER BY T.Dex_ID ASC
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
FROM
),
Sequenced AS
(
SELECT
G.Sequence_ID,
G.Dex_ID,
NewSequence_ID =
MAX(G.Sequence_ID) OVER (
PARTITION BY G.TargetDex_ID
ORDER BY G.Dex_ID
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
FROM Grouped AS G
)
UPDATE Sequenced
SET Sequenced.Sequence_ID = Sequenced.NewSequence_ID;
SELECT
T.Sequence_ID,
T.Dex_ID
FROM
ORDER BY
T.Dex_ID;
Sequence_ID | Dex_ID
----------: | -----:
1 | 1
1 | 2
1 | 3
2 | 4
2 | 5
2 | 6
3 | 7
3 | 8
3 | 9
4 | 10
4 | 11
4 | 12
3 | 13
3 | 14
3 | 15
.
SQL Server .
UPDATE (Transact-SQL):
UPDATE , , UPDATE . UPDATE , , OUTPUT.
. , "quirky update" , .