2013-01-14 14 views
14

Sono stato sorprendentemente in grado di trovare una funzione nth percentile per postgresql.calcoli all'ennesimo percentile in postgresql

Sto usando questo strumento olap di mondrian quindi ho solo bisogno di una funzione di aggregazione che restituisca un 95 ° percentile.

Ho trovato questo link:

http://www.postgresql.org/message-id/[email protected]

Ma per qualche ragione il codice in quella funzione percentile sta tornando nulli, in alcuni casi con determinate query. Ho controllato i dati e non c'è niente di strano nei dati che sembrerebbe causarlo!

+1

Hai provato 'percent_rank()', 'cume_dist()' o 'ntile()'? Dettagli [qui] (http://www.postgresql.org/docs/current/static/functions-window.html). –

+2

Vedi anche: http: // StackOverflow.it/a/14309370/330315 –

+0

Ah, avevo trovato quell'altra voce di overflow dello stack, ma non avevo creato la funzione di ordinamento dell'array. Ora funziona. Quindi questa domanda può essere chiusa o cancellata. – Codek

risposta

13

La funzione ntile è molto utile qui. Ho una tabella test_temp:

select * from test_temp 

score 
integer 
3 
5 
2 
10 
4 
8 
7 
12 

select score, ntile(4) over (order by score) as quartile from temp_test; 

score quartile 
integer integer 
2  1 
3  1 
4  2 
5  2 
7  3 
8  3 
10  4 
12  4 

ntile(4) over (order by score) ordina le colonne in base al punteggio, si divide in quattro anche gruppi (se il numero si divide in modo uniforme) e assegna il numero del gruppo in base all'ordine.

Poiché ho 8 numeri qui, rappresentano il 0 °, 12,5 °, 25 °, 37,5 °, 50 °, 62,5 °, 75 ° e 87,5 ° percentile. Quindi, se prendo solo i risultati in cui lo quartile è 2, avrò il 25 ° e il 37,5 ° percentile.

with ranked_test as (
    select score, ntile(4) over (order by score) as quartile from temp_test 
) 
select min(score) from ranked_test 
where quartile = 2 
group by quartile; 

rendimenti 4, il terzo più alto numero della lista di 8.

Se tu avessi un tavolo più grande e utilizzato ntile(100) la colonna di filtrare sulla sarebbe il percentile, e si potrebbe utilizzare la stessa query come sopra.

20

Con PostgreSQL 9.4 c'è il supporto nativo per percentili ora, attuata in funzioni di aggregazione ordinata Set:

percentile_cont(fraction) WITHIN GROUP (ORDER BY sort_expression) 

continuo percentile: restituisce un valore corrispondente al frazione specificata nell'ordinamento, interpolazione tra elementi di input adiacenti se necessario

percentile_cont(fractions) WITHIN GROUP (ORDER BY sort_expression) 

mult iple percentile continuo: restituisce un array di risultati corrispondente la forma del parametro frazioni, con ciascun elemento non nullo sostituito dal valore corrispondente a tale percentile

Vedere la documentazione per ulteriori dettagli: http://www.postgresql.org/docs/current/static/functions-aggregate.html

e vedere qui per alcuni esempi: https://github.com/michaelpq/michaelpq.github.io/blob/master/_posts/2014-02-27-postgres-9-4-feature-highlight-within-group.markdown

+1

La documentazione non ha un esempio. Ti dispiacerebbe aggiornare la tua risposta con alcuni semplici esempi? È strano ma Googling ha fornito solo alcuni esempi complessi. – tinkerr