5

自動生成された自動インクリメント ID をクエリ結果に追加する必要があります。たとえば、クエリの場合

SELECT TOP 3 Users.Reputation FROM Users ORDER BY 1 DESC

得る代わりに

  • 101
  • 100
  • 99

私は手に入れたい

  • 1、101
  • 2、100
  • 3、99

どうすればいいですか?

4

2 に答える 2

6

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 並べ替え)

于 2012-08-25T15:55:08.810 に答える
5

どうですか:

;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を参照してください。

于 2012-08-25T15:49:40.207 に答える