我需要在查询结果中添加一个自动生成的自动增量ID.例如,对于查询
SELECT TOP 3 Users.Reputation FROM Users ORDER BY 1 DESC
Run Code Online (Sandbox Code Playgroud)
而不是得到
我想得到
我该怎么做?
如果它是SQL Server最简单的方法,那么这个:
SELECT TOP 3
ROW_NUMBER() OVER(ORDER BY Users.Reputation DESC),
Users.Reputation
FROM Users
Run Code Online (Sandbox Code Playgroud)
更新:
我检查了查询执行计划,以及内部顺序,它定义了结果集的每个分区中的行的逻辑顺序(在这种情况下我没有使用指定的分区条件),使用Sort步骤,这是相同的正常排序:
SELECT Users.Reputation
FROM Users
ORDER BY Users.Reputation DESC
Run Code Online (Sandbox Code Playgroud)
在此步骤之后,有两个有趣的步骤:Segment和Sequence Project.第二个是告诉它是对有序数据集的计算.最后的步骤是TOP和SELECT.
我对这些缺点很感兴趣,但似乎没问题.
最后只是一个注释:正常的OrderBy和TOP:
SELECT TOP 3 Users.Reputation
FROM Users
ORDER BY Users.Reputation DESC
Run Code Online (Sandbox Code Playgroud)
排序更容易,但几乎相同:排序(前N种排序)
怎么样:
;WITH CTE AS
(SELECT
RowNum = ROW_NUMBER() OVER(ORDER BY Reputation DESC),
Users.Reputation
FROM
Users
)
SELECT TOP 3
RowNum, Reputation
FROM
CTE
ORDER BY
RowNum
Run Code Online (Sandbox Code Playgroud)
这是SQL Server 2005及更新版本中提供的CTE(通用表表达式),与ROW_NUMBER()排名功能相结合,也可在2005年及更早版本中使用.
它为下一个语句创建了一个"即时"视图,并允许在选择之前先进行一些额外的处理.该ROW_NUMBER()只是增加了一个连续数中每一行中定义的顺序OVER (ORDER BY ....)条款.所以第一行获得#1,第二行获得#2,依此类推.
在此处阅读有关CTE的更多信息:MSDN - 使用公用表表达式
ROW_NUMBER在这里阅读更多关于和其他排名功能:MSDN ROW_NUMBER