添加自动生成的ID以在结果中记录

Yos*_*ale 5 sql sql-server

我需要在查询结果中添加一个自动生成的自动增量ID.例如,对于查询

SELECT TOP 3 Users.Reputation FROM Users ORDER BY 1 DESC
Run Code Online (Sandbox Code Playgroud)

而不是得到

  • 101
  • 100
  • 99

我想得到

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

我该怎么做?

And*_*ttó 6

如果它是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种排序)


mar*_*c_s 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
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