自動生成された自動インクリメント ID をクエリ結果に追加する必要があります。たとえば、クエリの場合
SELECT TOP 3 Users.Reputation FROM Users ORDER BY 1 DESC
得る代わりに
- 101
- 100
- 99
私は手に入れたい
- 1、101
- 2、100
- 3、99
どうすればいいですか?
自動生成された自動インクリメント ID をクエリ結果に追加する必要があります。たとえば、クエリの場合
SELECT TOP 3 Users.Reputation FROM Users ORDER BY 1 DESC
得る代わりに
私は手に入れたい
どうすればいいですか?
SQL Server の場合の最も簡単な方法は、次のとおりです。
SELECT TOP 3
ROW_NUMBER() OVER(ORDER BY Users.Reputation DESC),
Users.Reputation
FROM Users
アップデート:
同じソートステップを使用して、クエリ実行プランと、結果セットの各パーティション内の行の論理的な順序を定義する内部順序 (この場合、指定されたパーティション条件は使用しませんでした) を確認しました。通常の並べ替えと同じように:
SELECT Users.Reputation
FROM Users
ORDER BY Users.Reputation DESC
このステップの後に、セグメントとシーケンス プロジェクトという 2 つの興味深いステップがあります。2 つ目は、順序付けられたデータセットに対する計算であることを示しています。最後のステップは TOP と SELECT です。
私は欠点に興味がありますが、それは問題ないようです。
そして最後に注意してください: TOP を使用した通常の OrderBy の場合:
SELECT TOP 3 Users.Reputation
FROM Users
ORDER BY Users.Reputation DESC
並べ替えは簡単ですが、ほとんど同じです: 並べ替え (上位 N 並べ替え)
どうですか:
;WITH CTE AS
(SELECT
RowNum = ROW_NUMBER() OVER(ORDER BY Reputation DESC),
Users.Reputation
FROM
Users
)
SELECT TOP 3
RowNum, Reputation
FROM
CTE
ORDER BY
RowNum
これは、SQL Server 2005ROW_NUMBER()
以降で使用できる CTE (Common Table Expression) であり、ランキング関数と組み合わせて、 2005 以降でも使用できます。
次のステートメントだけの「オンザフライ」ビューを作成し、選択する前に最初に追加の処理を行うことができます。句ROW_NUMBER()
で定義された順序で各行に連続番号を追加するだけです。OVER (ORDER BY ....)
したがって、最初の行が #1、2 番目の行が #2 というようになります。
CTE の詳細については、MSDN - 共通テーブル式の使用を参照してください。
ROW_NUMBER
およびその他のランキング関数の詳細については、 MSDN ROW_NUMBERを参照してください。