2008-11-11 71 views
4

假设我有一条SELECT语句返回一些结果集合。有没有一些方法,我可以我的编号通过以下方式结果:SQL:对SELECT语句返回的行进行编号

SELECT TOP 3的名字从PuppyNames ORDER BY NumberOfVotes

会给我...

路虎

弗雷迪克鲁格

...但我想...

1,菲多

2,路虎

3,弗雷迪克鲁格

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

+0

你的ORDER BY子句中很可能使用DESC修饰符。 – BoltBait 2008-11-11 22:38:09

回答

2

在客户端应用程序中添加数字通常更容易。 SQL中有技巧,但对纯粹主义者来说,他们涉及作弊,而且他们通常不是可移植的。

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

0

SQL 2005,2008:

SELECT TOP 3 ROW_NUMBER()OVER(ORDER BY NumberOfVotes DESC)AS VoteRank,名称 FROM PuppyNames

编辑:对不起 - 只是看到你指定的2000

+0

哇,2000年没有解析函数? – 2008-11-11 22:26:51

+0

直到2003年,我认为分析函数甚至不是ANSI标准的一部分。 – quillbreaker 2013-11-15 15:31:10

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

你也可以用一个临时表做到这一点:

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语句是在那里。它只是包围着让行号工作的东西。

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