假设我有一个返回一组结果的 SELECT 语句。有什么方法可以按以下方式对结果进行编号:
从 PuppyNames 中选择前 3 个名称,按 NumberOfVotes 排序
会给我...
菲多
漫游者
弗雷迪克鲁格
...但我想要...
1、菲多
2、罗孚
3、弗雷迪克鲁格
当然,逗号表示数字在它们自己的列中。[我使用的是 SQL Server 2000。]
假设我有一个返回一组结果的 SELECT 语句。有什么方法可以按以下方式对结果进行编号:
从 PuppyNames 中选择前 3 个名称,按 NumberOfVotes 排序
会给我...
菲多
漫游者
弗雷迪克鲁格
...但我想要...
1、菲多
2、罗孚
3、弗雷迪克鲁格
当然,逗号表示数字在它们自己的列中。[我使用的是 SQL Server 2000。]
在 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
使用 SQL 2000,您需要使用相关子查询。
SELECT (
SELECT COUNT(*)
FROM PuppyNames b
WHERE b.Popularity <= a.Popularity
) AS Ranking
, a.Name
FROM PuppyNames a
ORDER BY a.Popularity
在客户端应用程序中添加数字通常更容易。SQL 中有一些技巧,但对于纯粹主义者来说,它们涉及作弊,而且它们通常不可移植。
对我来说,这是我最基本的重构模式之一。
您也可以使用临时表来执行此操作:
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 语句就在其中。它只是被使行号起作用的东西所包围。
您可以使用此查询,它考虑到 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
SQL 2005、2008:
选择 TOP 3 ROW_NUMBER() OVER(ORDER BY NumberOfVotes DESC) 作为 VoteRank,名称来自 PuppyNames
编辑:对不起 - 刚刚看到你指定 2000。