SQL:对 SELECT 语句返回的行进行编号
Posted
技术标签:
【中文标题】SQL:对 SELECT 语句返回的行进行编号【英文标题】:SQL: Numbering the rows returned by a SELECT statement 【发布时间】:2008-11-11 22:13:33 【问题描述】:假设我有一个返回一组结果的 SELECT 语句。有什么方法可以按以下方式对结果进行编号:
从 PuppyNames 按 NumberOfVotes 排序选择前 3 个名称
会给我...
菲多
漫游者
弗雷迪·克鲁格
...但我想要...
1,菲多
2,漫游者
3,弗雷迪·克鲁格
当然,逗号表示数字在它们自己的列中。 [我使用的是 SQL Server 2000。]
【问题讨论】:
您的 ORDER BY 子句可能使用 DESC 修饰符。 【参考方案1】:在 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
【讨论】:
【参考方案2】:使用 SQL 2000,您需要使用相关子查询。
SELECT (
SELECT COUNT(*)
FROM PuppyNames b
WHERE b.Popularity <= a.Popularity
) AS Ranking
, a.Name
FROM PuppyNames a
ORDER BY a.Popularity
【讨论】:
如果两条或更多记录具有相同的流行度,这将不起作用。一般来说,它提供排名而不是编号。【参考方案3】:在客户端应用程序中添加数字通常更容易。 SQL 中有一些技巧,但对于纯粹主义者来说,它们涉及作弊,而且它们通常不可移植。
对我来说,这是我最基本的重构模式之一。
【讨论】:
【参考方案4】:你也可以用临时表来做:
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 语句就在其中。它只是被使行号起作用的东西所包围。
【讨论】:
【参考方案5】:您可以使用此查询,它会考虑到 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
【讨论】:
【参考方案6】:SQL 2005、2008:
SELECT TOP 3 ROW_NUMBER() OVER(ORDER BY NumberOfVotes DESC) AS VoteRank, Name FROM PuppyNames
编辑:抱歉 - 刚刚看到你指定了 2000。
【讨论】:
哇,2000 没有分析函数? 我认为分析函数直到 2003 年才成为 ANSI 标准的一部分。以上是关于SQL:对 SELECT 语句返回的行进行编号的主要内容,如果未能解决你的问题,请参考以下文章
订单列表查询SQL,查询出订单的数量和订单详细信息(包括订单中的所有商品)。