rank()だけでなく、over()節の 'arrival_time is not null'によってパーティションを分割するのがより一般的な集計関数です。これにより、すべてのnull arrival_time行が同じグループに配置され、同じランクが与えられ、非ヌル行はお互いにのみ相対的にランク付けされます。
意味のある例のために、私は最初の問題セットよりも多くの行を持つCTEを嘲笑しました。広い行を許してください、しかし、私は彼らが異なる技術をよりよく対照していると思います。
with dinner_show_up("person", "arrival_time", "restaurant") as (values
('Dave' , 7, 'in_and_out')
,('Mike' , 2, 'in_and_out')
,('Bob' , null, 'in_and_out')
,('Peter', 3, 'in_and_out')
,('Jane' , null, 'in_and_out')
,('Merry', 5, 'in_and_out')
,('Sam' , 5, 'in_and_out')
,('Pip' , 9, 'in_and_out')
)
select
person
,case when arrival_time is not null then rank() over ( order by arrival_time) end as arrival_rank_without_partition
,case when arrival_time is not null then rank() over (partition by arrival_time is not null order by arrival_time) end as arrival_rank_with_partition
,case when arrival_time is not null then percent_rank() over ( order by arrival_time) end as arrival_pctrank_without_partition
,case when arrival_time is not null then percent_rank() over (partition by arrival_time is not null order by arrival_time) end as arrival_pctrank_with_partition
from dinner_show_up
このクエリは、arrival_rank_with/without_partitionについても同じ結果を示します。ただし、percent_rank()の結果は異なります。with_partitionは0%〜71.4%の間で間違っていますが、with_partitionではpctrank()が0%〜100%の範囲に正しく設定されています。
この同じパターンは、ntile()集計関数にも適用されます。
これは、すべてのヌル値を非ヌル値からランク付けの目的で分離することによって機能します。これにより、JaneとBobは0%〜100%のパーセンタイル順位から除外されます。
|person|arrival_rank_without_partition|arrival_rank_with_partition|arrival_pctrank_without_partition|arrival_pctrank_with_partition|
+------+------------------------------+---------------------------+---------------------------------+------------------------------+
|Jane |null |null |null |null |
|Bob |null |null |null |null |
|Mike |1 |1 |0 |0 |
|Peter |2 |2 |0.14 |0.2 |
|Sam |3 |3 |0.28 |0.4 |
|Merry |4 |4 |0.28 |0.4 |
|Dave |5 |5 |0.57 |0.8 |
|Pip |6 |6 |0.71 |1.0 |
パーフェクト - ありがとう! –
+1興味深いことに、SQL ServerのランクではNULLがなくなる前にNULLが処理され、ランクにはギャップがあります。ポストグルはNULLを処理していないか、またはそれらを数えません。 –
@RomanPekar RANK()関数のORDER BY(または通常のクエリ)の最初または最後にNULLを入れるかどうかを定義できます - > http://www.postgresql.org/docs/current/static/ indexes-ordering.html – bma