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语句中,ORDERBY子句的功能是()

返回 SQL 中返回空值的行?显示它们不是空白值

订单列表查询SQL,查询出订单的数量和订单详细信息(包括订单中的所有商品)。

SQL SELECT INTO 语句

具有增量整数列的 MSSQL Select 语句...不是来自表

sql查询语句并不是最先执行SELECT