假设我有一个SELECT语句,它返回一些结果集。有什么方法可以用以下方式对我的结果进行编号:
选择TOP 3名称来自PuppyNames ORDER BY NumberOfVotes
会给我......
菲多
流动站
弗雷迪克鲁格
......但我想...
1,Fido
2,罗孚
3,Freddy Krueger
当然,逗号表示这些数字在他们自己的列中。 [我正在使用SQL Server 2000。]
答案 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。