Postgresql

PostgreSQL ntile() 分區

  • January 16, 2018

我有一個帶有人口值的點網格。每個點都有一個 id 和 population 值。我也有一個 state_id ,它說明該點處於什麼狀態。

現在我想計算每個州的百分位數 ntile(100)。

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

當我使用它時,我認為它會計算所有點和狀態的 ntile。

如果您想要 per 百分位數state,請PARTITION BY state_idOVER子句中使用。

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;

根據數學定律,相同的值將始終具有相同的百分位值。例如,如果 Mary 的考試成績是 76,Fred 的成績也是 76,而 Mary 的得分在前 2% 的百分位數 - 那麼 Fred 也是如此!

在上面的範例數據中,有 7 個 1 和 3 個 2。然而,NTILE 列返回五個 1 和五個 2。這在數學上證明了我上面關於 NTILE(100) 的陳述。NTILE(100) 無法計算百分位數,因為 NTILE 均勻分佈行。

我之前已經說過,但值得重複一遍:NTILE 和 Percent_rank 沒有任何關係,它們甚至不是同一個 ANSI SQL 函式家族的成員。NTILE 是一個視窗排名函式,不考慮平局;NTILE 的存在只做一件事:均勻地劃分行。另一方面,Percent_Rank 是一個排名分佈函式,並且只會在兩個值相同時將重複值分配給它們。巨大的差異。是的,在某些情況下 NTILE(100) 會返回正確的答案,但這是巧合;注意這篇文章:令人討厭的快速百分比排名

引用自:https://dba.stackexchange.com/questions/137922