web-dev-qa-db-ja.com

PostgreSQL ntile()パーティション

人口値のあるポイントグリッドがあります。各ポイントにはIDと母集団の値があります。また、ポイントの状態を示すstate_idもあります。

次に、各状態のパーセンタイルntile(100)を計算します。

   SELECT  id, population, state_id, 
   ntile(100) OVER(ORDER BY car20) as percentile
   FROM avi_threshold01 

これを使用すると、すべてのポイントと状態でntileが計算されると思います。

3
fabvys

stateごとのパーセンタイルが必要な場合は、OVER句でPARTITION BY state_idを使用します。

そして、そのGROUP BYは少なくとも疑わしいように見えます。パーセンタイルが必要な場合は削除する必要があると思います。そして、PKによるグループ化は、とにかく操作なしです。

   SELECT  
       id, population, state_id, 
       ntile(100) OVER (PARTITION BY state_id ORDER BY car20) AS percentile
   FROM 
       avi_threshold01 ;
6
ypercubeᵀᴹ

私はこれが古い投稿であることを知っていますが、NTILEはパーセンタイルを正確に計算できません。これにNTILE(100)を使用できるという誤った考えは、複数のSQL方言にまたがるフィクションです。これはMicrosoft T-SQLの世界でよく見られます。

次のクエリを検討してください。

WITH sampleData as (SELECT v FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(2),(2),(2)) as x(v))
SELECT V, NTILE (2) OVER(ORDER BY v) AS nt
FROM sampleData;

数学の法則によれば、同一の値は常に同じパーセンタイル値になります。たとえば、メアリーのテストスコアが76でフレッドも76であり、メアリーが上位2%のパーセンタイルでスコアを獲得した場合、フレッドもそうでした。

上記のサンプルデータには、1が7つ、2が3つあります。それでも、NTILE列は5つの1と5つの2を返します。これは、NTILE(100)に関する上記のステートメントを数学的に証明します。 NTILEは行を均等に分散するため、NTILE(100)はパーセンタイルを計算できません。

前にも言ったが、繰り返す価値がある。NTILEとPercent_rankはまったく関係がなく、ANSI SQL関数の同じファミリーのメンバーでさえない。 NTILEはウィンドウランキング関数であり、関係を考慮しません。 NTILEは、行を均等に分割するという1つのことだけを行うために存在します。一方、Percent_Rankはランク分布関数であり、2つの値が同一の場合にのみ重複する値を割り当てます。大きな違い。はい、NTILE(100)は正しい答えを返しますが、偶然です。この記事に注意してください: Nasty Fast Percent Rank

2
Alan Burstein