5

我需要将自动生成的自动增量 ID 添加到查询结果中。例如,对于查询

SELECT TOP 3 Users.Reputation FROM Users ORDER BY 1 DESC

而不是得到

  • 101
  • 100
  • 99

我想得到

  • 1, 101
  • 2, 100
  • 3, 99

我该怎么做?

4

2 回答 2

6

如果是 SQL Server,最简单的方法是:

SELECT TOP 3 
ROW_NUMBER() OVER(ORDER BY Users.Reputation DESC), 
Users.Reputation 
FROM Users

更新:

我检查了查询执行计划和内部顺序,它使用排序步骤定义了结果集的每个分区内行的逻辑顺序(在这种情况下我没有使用指定的分区条件),这是相同的按照正常排序:

SELECT Users.Reputation
FROM Users
ORDER BY Users.Reputation DESC

这一步之后有两个有趣的步骤:Segment和Sequence Project。第二个是告诉它是对有序数据集的计算。最后一步是 TOP 和 SELECT。

我对缺点很感兴趣,但似乎还可以。

最后只是一个注释:使用带有 TOP 的普通 OrderBy:

 SELECT TOP 3 Users.Reputation
    FROM Users
    ORDER BY Users.Reputation DESC

排序更容易,但几乎相同:Sort (Top N sort)

于 2012-08-25T15:55:08.810 回答
5

怎么样:

;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

这是 SQL Server 2005及更高版本中可用的 CTE(通用表表达式),结合ROW_NUMBER()排名功能,也可在 2005 和更高版本中使用。

它为下一条语句创建一个“即时”视图,并允许在选择之前先进行一些额外的处理。只是按照子句ROW_NUMBER()中定义的顺序为每一行添加一个连续的数字。OVER (ORDER BY ....)所以第一行得到#1,第二行得到#2,依此类推。

在此处阅读有关 CTE 的更多信息:MSDN - 使用公用表表达式

在此处阅读有关ROW_NUMBER其他排名功能的更多信息:MSDN ROW_NUMBER

于 2012-08-25T15:49:40.207 回答