2008-11-11 67 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