1

ランキング関数のDENSE_RANK()関数とその働きをよく知っています。しかし、私は常にこの関数の名前を書くだけで、暗黙のうちにその仕事をするので、明示的にどのように機能するかを見ることができず、T_SQL 言語でこの関数内の操作を行う構造を見るのが好きです。それを手伝ってくれませんか。

4

1 に答える 1

1

これは、実行計画から確認できます。

サンプルコード

CREATE TABLE #T
(ID INT IDENTITY(1,1) PRIMARY KEY,
G INT NOT NULL,
S INT NOT NULL)

INSERT INTO #T (G, S) VALUES (1,1),(1,1),(1,3),(1,4),(2,1)

SELECT G,S, DENSE_RANK() OVER (PARTITION BY G ORDER BY S) AS D
FROM #T

実行計画

ここに画像の説明を入力してください

説明

事前に並べ替えられた使用する適切なインデックスがないため、最初にデータをG、Sの順序で並べ替える必要があります。

次に、2つのセグメントイテレータがあります。セグメントイテレータには「GROUPBY」プロパティがあります。現在の行が前の行と同じグループにあるかどうかを示すセグメント列を出力します。

最初のセグメントイテレータは、パーティショニング列Gでグループ化し、セグメント列Segment1004を出力します。

2番目のセグメントイテレータはG、Sでグループ化し、Segment1005をセグメント列として出力します。

シーケンスプロジェクトイテレータはdense_rank、これらの入力に基づいて値を出力します。Segment1004がこれが新しいパーティショニンググループであることを示している場合は1を出力し、そうでない場合は、Segment1005の値をチェックして、前回と同じ値を出力するか、最初にインクリメントするかを判断します。

詳細については、PaulWhiteによるこの記事を参照してください。

于 2010-09-08T11:38:56.823 に答える