Aru*_*mar 4 sql sql-server select row-number
我有一个方案来获得基于Id列的结果集的零索引值.我能做到这一点ROW_NUMBER().但现在的预期行为略有变化.
对于前五个记录,只有IndexValue需要显示的内容IndexValue应该是剩余的条目NULL.
为了实现这一点,我设置了IndexValueby 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;
Run Code Online (Sandbox Code Playgroud)
通过这种方法,我能够实现我的期望,但有我可以将任何其他方式ROW_NUMBER()只为TOP N记录而SELECT?
您可以case在查询中使用表达式:
SELECT Id, Name, CASE WHEN IndexValue < 5 THEN IndexValue END AS IndexValue
FROM (SELECT Id, Name, ROW_NUMBER() OVER (ORDER BY Id) - 1 AS IndexValue
FROM @OriginalTable) t
Run Code Online (Sandbox Code Playgroud)