假设我有一条SELECT语句返回一些结果集合。有没有一些方法,我可以我的编号通过以下方式结果:SQL:对SELECT语句返回的行进行编号
SELECT TOP 3的名字从PuppyNames ORDER BY NumberOfVotes
会给我...
菲
路虎
弗雷迪克鲁格
...但我想...
1,菲多
2,路虎
3,弗雷迪克鲁格
这里当然逗号表示这些数字在他们自己的专栏中。 [我正在使用SQL Server 2000.]
假设我有一条SELECT语句返回一些结果集合。有没有一些方法,我可以我的编号通过以下方式结果:SQL:对SELECT语句返回的行进行编号
SELECT TOP 3的名字从PuppyNames ORDER BY 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中有技巧,但对纯粹主义者来说,他们涉及作弊,而且他们通常不是可移植的。
对我来说,这是我最基本的重构模式之一。
SQL 2005,2008:
SELECT TOP 3 ROW_NUMBER()OVER(ORDER BY NumberOfVotes DESC)AS VoteRank,名称 FROM PuppyNames
编辑:对不起 - 只是看到你指定的2000
哇,2000年没有解析函数? – 2008-11-11 22:26:51
直到2003年,我认为分析函数甚至不是ANSI标准的一部分。 – quillbreaker 2013-11-15 15:31:10
对于SQL 2000,您需要使用相关的子查询。
SELECT (
SELECT COUNT(*)
FROM PuppyNames b
WHERE b.Popularity <= a.Popularity
) AS Ranking
, a.Name
FROM PuppyNames a
ORDER BY a.Popularity
你也可以用一个临时表做到这一点:
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
你的ORDER BY子句中很可能使用DESC修饰符。 – BoltBait 2008-11-11 22:38:09