人口値のあるポイントグリッドがあります。各ポイントにはIDと母集団の値があります。また、ポイントの状態を示すstate_idもあります。
次に、各状態のパーセンタイルntile(100)を計算します。
SELECT id, population, state_id,
ntile(100) OVER(ORDER BY car20) as percentile
FROM avi_threshold01
これを使用すると、すべてのポイントと状態でntileが計算されると思います。
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 ;
私はこれが古い投稿であることを知っていますが、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