2

私の本はそれを言っています-

1-ランキング関数(RANK()、DENSE_RANK()、ROW_NUMBER()など)には、OVER()句が必要です。

したがって、以下のコードは間違っています-

select *, RANK()
from [grant]
order by Amount desc

エラー-「RANK」の近くの構文が正しくありません。「OVER」が必要です。

上記のコードでRANK()の後にOVER()を追加すると、再びエラーが発生します。(エラー-ランキング関数「RANK」にはORDER BY句が必要です。)

2-次に、私の本は、「ランキング関数は、OVER()の引数として表示されるためにORDERBY情報が必要です」と付け加えています。

select *, RANK() OVER(ORDER BY Amount DESC) as GrantRank
from [grant]

私の質問は-

1-ランキング関数を含むOVER()句が必要なのはなぜですか? 2-なぜorderbyステートメントを削除してOVER()内に配置する必要があるのですか?

この本はこれらの背後にある論理を説明していません!私がそれを理解するのを手伝ってください。

前もって感謝します。

4

2 に答える 2

3

なぜOVER()ランキング関数付きの句が必要なのですか?

このOVER()句は、SQLServerがのようなものをどのように決定するかを正確に認識できるようにするために必要ですRANK()RANK()SQL Serverに順序付け基準を提供しない場合、何を期待しますか?レースの勝者は、アルファベット順で最も速い時間、最も遅い時間、または名の人ですか?

order byステートメントを削除して、その中に入れる必要があるのはOVER()なぜですか?

内に句ORDER BYを追加するときに、句を削除する必要はありません。これらは独立して使用されます。1つはを決定するため、もう1つは順序を決定するためです。ORDER BYOVER()RANK()

したがって、たとえば、レースのフィニッシャーを返したいが、最後の場所から最初の場所に注文する場合は、次のように言うことができます。

SELECT 
  name, 
  finish_time, 
  [rank] = RANK() OVER (ORDER BY finish_time) -- fastest first
FROM 
  dbo.race_table
ORDER BY 
  finish_time DESC; -- fastest last
于 2013-01-13T03:22:49.790 に答える
0

何が起こっているのかを理解するには、RANK関数が何をしているのかを理解する必要があります。つまり、いくつかの列に基づいてデータのランキングを返します。同点の場合も同じランキングになります。したがって、付与テーブルのどの行が最も金額が高いかを知りたい場合は、その特定の列の降順で並べ替える必要があります。

あらゆるスポーツのランキングを想像してみてください。最初に2つのチームを結び付けることができ、ランキングの次のチームは3位になります。それは本質的にRANK関数があなたのために行っていることです。

これはMSDNの便利な記事です。

そして、これも役立つかもしれないSQLFiddleです。

于 2013-01-13T03:23:03.077 に答える