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

一時テーブルを使用して行うこともできます。

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 に答える
2

通常、クライアント アプリで数値を追加する方が簡単です。SQLにはトリックがありますが、純粋主義者にとっては不正行為を伴い、一般的に移植性がありません.

私にとって、これは最も基本的なリファクタリング パターンの 1 つです。

于 2008-11-11T22:17:21.597 に答える
1

同じ NumberOfVotes の場合に正しい番号付けを提供するために、PK を考慮に入れるこのクエリを使用できます。

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:

SELECT TOP 3 ROW_NUMBER() OVER(ORDER BY NumberOfVotes DESC) AS VoteRank, Name FROM PuppyNames

編集: 申し訳ありませんが、2000 を指定したのを見ました。

于 2008-11-11T22:22:12.930 に答える