SQL:对SELECT语句返回的行进行编号

时间:2008-11-11 22:13:33

标签: sql sql-server sql-server-2000

假设我有一个SELECT语句,它返回一些结果集。有什么方法可以用以下方式对我的结果进行编号:

  

选择TOP 3名称来自PuppyNames ORDER BY NumberOfVotes

会给我......

  

菲多

     

流动站

     弗雷迪克鲁格

......但我想...

  

1,Fido

     

2,罗孚

     3,Freddy Krueger

当然,逗号表示这些数字在他们自己的列中。 [我正在使用SQL Server 2000。]

6 个答案:

答案 0 :(得分:5)

在Microsoft SQL Server 2005中,您具有ROW_NUMBER()功能,可以完全按照您的要求执行操作。

如果您遇到SQL Server 2000,典型的技术是创建一个新的临时表来包含查询结果,并添加IDENTITY列并生成增量值。请参阅此处讨论此技术的文章:http://www.databasejournal.com/features/mssql/article.php/3572301/RowNumber-function-in-SQL-Server-2005.htm

答案 1 :(得分:3)

使用SQL 2000,您需要使用相关的子查询。

   SELECT (
              SELECT COUNT(*)
                FROM PuppyNames b
               WHERE b.Popularity <= a.Popularity
          ) AS Ranking
        , a.Name
     FROM PuppyNames a
 ORDER BY a.Popularity

答案 2 :(得分:2)

在客户端应用中添加数字通常更容易。 SQL中有一些技巧,但对于纯粹主义者来说,它们涉及作弊,而且它们通常不是便携式的。

对我来说,这是我最基本的重构模式之一。

答案 3 :(得分:2)

您也可以使用临时表:

SELECT TOP 3 Name FROM PuppyNames ORDER BY NumberOfVotes DESC

变为

CREATE TABLE #RowNumberTable (
    RowNumber int IDENTITY (1,1),
    PuppyName varchar(MAX)
)
INSERT #RowNumberTable (PuppyName)
SELECT TOP 3 Name FROM PuppyNames ORDER BY NumberOfVotes DESC
SELECT * from #RowNumberTable ORDER BY RowNumber
DROP TABLE #RowNumberTable

如果您注意到,您的SELECT语句就在那里。它只是被行号所包围的东西所包围。

答案 4 :(得分:1)

您可以使用此查询,该查询考虑了PK,以便在相同NumberOfVotes的情况下提供正确的编号:

SELECT TOP 3 COUNT(*) AS Number, p1.Name
FROM PuppyNames AS p1 INNER JOIN PuppyNames AS p2 
    ON p1.NumberOfVotes < p2.NumberOfVotes OR (p1.NumberOfVotes = p2.NumberOfVotes AND p1.ID >= p2.ID)
GROUP BY p1.Name
ORDER BY Number

答案 5 :(得分:0)

SQL 2005,2008:

SELECT TOP 3 ROW_NUMBER()OVER(订购NumberOfVotes DESC)AS VoteRank,名称 来自PuppyNames

编辑:对不起 - 刚看到你指定了2000。