4

假设我有一个返回一组结果的 SELECT 语句。有什么方法可以按以下方式对结果进行编号:

从 PuppyNames 中选择前 3 个名称,按 NumberOfVotes 排序

会给我...

菲多

漫游者

弗雷迪克鲁格

...但我想要...

1、菲多

2、罗孚

3、弗雷迪克鲁格

当然,逗号表示数字在它们自己的列中。[我使用的是 SQL Server 2000。]

4

6 回答 6

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

于 2008-11-11T22:23:41.460 回答
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
于 2008-11-11T22:26:16.510 回答
2

在客户端应用程序中添加数字通常更容易。SQL 中有一些技巧,但对于纯粹主义者来说,它们涉及作弊,而且它们通常不可移植。

对我来说,这是我最基本的重构模式之一。

于 2008-11-11T22:17:21.597 回答
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 语句就在其中。它只是被使行号起作用的东西所包围。

于 2008-11-11T22:35:05.150 回答
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
于 2008-11-11T22:59:25.287 回答
0

SQL 2005、2008:

选择 TOP 3 ROW_NUMBER() OVER(ORDER BY NumberOfVotes DESC) 作为 VoteRank,名称来自 PuppyNames

编辑:对不起 - 刚刚看到你指定 2000。

于 2008-11-11T22:22:12.930 回答