У меня есть сценарий, чтобы получить нулевое индексированное значение для набора результатов на основе столбца Id
.Я могу достичь этого с помощью ROW_NUMBER()
.Но в ожидаемом поведении произошли небольшие изменения.
Ожидается, что для пяти первых записей необходимо отобразить только IndexValue
, для остальных записей IndexValue
должно быть NULL
.
Для этого я установил IndexValue
на ROW_NUMBER()
, вставил в табличную переменную @PopulateValues
, затем с помощью UPDATE
я получил ожидаемый результат, как показано ниже:
ЧтоЯ пробовал:
-- Actual Table in database
DECLARE @OriginalTable TABLE (Id INT IDENTITY(1, 1), [Name] VARCHAR (255));
INSERT INTO @OriginalTable ([Name]) VALUES
('Name 01'), ('Name 02'), ('Name 03'), ('Name 04'), ('Name 05'),
('Name 06'), ('Name 07'), ('Name 08'), ('Name 09'), ('Name 10'),
('Name 11'), ('Name 12'), ('Name 13'), ('Name 14'), ('Name 15');
-- Table variable for the populate calculation
DECLARE @PopulateValues TABLE (Id INT, [Name] VARCHAR (255), IndexValue INT NULL);
INSERT INTO @PopulateValues (Id, [Name], IndexValue)
SELECT Id, [Name], ROW_NUMBER() OVER (ORDER BY Id) - 1 AS IndexValue
FROM @OriginalTable;
UPDATE @PopulateValues SET IndexValue = NULL WHERE IndexValue >= 5;
SELECT * FROM @PopulateValues;
При таком подходе я могу достичь своих ожиданий, но есть ли другой способ применения ROW_NUMBER()
только для TOP N
записей, в то время как SELECT