1

次のサンプル データを検討してください。

Name    Email  RowRank   PartitionRank
----    -----  -------   -------------
a1      e1      1         1
a1      e1      2         1
a2      e2      1         2
a2      e2      2         2
a2      e2      3         2

名前と電子メールでデータを分割し、各パーティションの行のインデックスとパーティション自体の数を取得するクエリを作成しようとしています (最後の 2 列には、予想される出力がリストされています)。

さまざまなクエリを試してみましたが、RowRank は ROW_NUMBER で簡単に生成できますが、4 つのランキング関数 (NTILE、RANK、DENSE_RANK、または ROW_RANK) のいずれを使用してもパーティション ランクを生成できません。私はこれが可能であるべきだと確信していますが、自分でそれに乗ることはできません。

サンプルクエリは次のとおりです。

SELECT Name, Email,
        ROW_NUMBER() OVER (PARTITION BY Name, Email ORDER BY Email, DisplayName) AS RowRank,
        NTILE(1) OVER (PARTITION BY Name, Email ORDER BY Email, DisplayName) AS PartitionRank
FROM Zone.MyTable

誰かがパーティションのランクを正しくするのを手伝ってくれませんか?

4

3 に答える 3

3

出力全体に DENSE_RANK() が必要です (パーティション分割なし)

SELECT Name, Email,
        ROW_NUMBER() OVER (PARTITION BY Name, Email ORDER BY Email, DisplayName) AS RowRank,
        DENSE_RANK() OVER (ORDER BY Name, Email) AS PartitionRank
FROM Zone.MyTable
于 2014-01-10T22:52:47.483 に答える
2

これは私のために働く:

select *
  , RowRank = row_number() over (partition by Name order by Email)
  , PartitionRank = dense_rank() over (order by Name)
from MyTable

demo を使用した SQL Fiddle

于 2014-01-10T22:52:39.223 に答える