2017-06-07 3 views
0

は、データベースに動作します:MS SQL RANK関数

質問#1

select rank() over (partition by costrate order by costrate), costrate 
from Production.Location 

私はなぜ疑問に思って、1の結果を取得します。パーティションを削除してただちに注文すると、すべてのコストレートが0になり、次のコストレート値に次のランク値が設定されます。

locationidランク別の質問の2

select rank() over (partition by costrate order by locationid) ranknum, 
     costrate, locationid 
from Production.Location 
order by ranknum 

私は上記を実行し、再びcostrateことによってそれを分割#が、順序が一致していないようです。誰かが両方のクエリで何が起こっているのか説明できますか?

ありがとうございました。

+0

'RANK()'がどのように動作するのかドキュメントを見ましたか? –

+0

ウィンドウ関数の 'PARTITION BY'と' ORDER BY'の両方に同じ列/式を持つことはめったにありません。ここでそれをする理由は不明です。 –

答えて

0

私は1の結果を得ます、なぜ私は不思議に思っています。

ドキュメントを読む時間!そして、なぜあなたがこの方法でこの機能を使用しているのか考えてみてください。

コストレートでパーティション化すると、コストレートのそれぞれの値は、ランク付けの目的でグループ化されます。 rank by order by句と同じ値を持つグループのすべてのメンバーに同じ値を割り当てます。したがって、コストが0.00の行はすべて1つのグループになります。各グループメンバは同じ値を持つので、それらはすべて同じランク値1を取得します。各グループ[コストレートの一意の値(パーティション単位)]を繰り返し、コストレート(order by)に基づいて値を割り当てます。 locationidランクによって

順序はそれがない。もちろん、

と一致していないようです。あなたはlocationidで注文し、cost = 0.00の行はどれも同じlocationidを持っていません。 select文のorder by句を "order by costrate、locationid"と置き換えます(これがランキングロジックなので)。より直感的に何が起こるかがわかります。

関連する問題