一連の結果を返す SELECT ステートメントがあるとします。次の方法で結果に番号を付ける方法はありますか。
PuppyNames から上位 3 つの名前を選択し、NumberOfVotes で並べ替えます
私にくれるだろう...
ファイド
ローバー
フレディクルーガー
...でも私はしたい...
1、ファイド
2、ローバー
3、フレディ・クルーガー
もちろん、コンマは数値が独自の列にあることを示します。[SQL Server 2000 を使用しています。]
一連の結果を返す SELECT ステートメントがあるとします。次の方法で結果に番号を付ける方法はありますか。
PuppyNames から上位 3 つの名前を選択し、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 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 ステートメントがあります。行番号を機能させるものに囲まれているだけです。
通常、クライアント アプリで数値を追加する方が簡単です。SQLにはトリックがありますが、純粋主義者にとっては不正行為を伴い、一般的に移植性がありません.
私にとって、これは最も基本的なリファクタリング パターンの 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
SQL 2005、2008:
SELECT TOP 3 ROW_NUMBER() OVER(ORDER BY NumberOfVotes DESC) AS VoteRank, Name FROM PuppyNames
編集: 申し訳ありませんが、2000 を指定したのを見ました。