2013-01-14 19 views
14

Ich war überraschend nicht in der Lage, eine n-ten Perzentil-Funktion für Postgresql zu finden.Nte Perzentil Berechnungen in Postgresql

Ich benutze dies über Mondrian Olap-Tool, so brauche ich nur eine Aggregatfunktion, die ein 95. Perzentil zurückgibt.

habe ich diesen Link finden:

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

Aber aus irgendeinem Grund den Code in dieser Perzentil Funktion nulls in einigen Fällen mit bestimmten Abfragen zurück. Ich habe die Daten überprüft und es gibt nichts Seltsames in den Daten, das das zu verursachen scheint!

+1

Haben Sie prozent_rank() ',' cume_dist() 'oder' ntile() 'versucht? Details [hier] (http://www.postgresql.org/docs/current/static/functions-window.html). –

+2

Siehe auch: http: // stackoverflow.com/a/14309370/330315 –

+0

Ah, ich hatte diesen anderen Stack-Überlauf-Eintrag gefunden, aber hatte nicht die Array-Sortierfunktion erstellt. Es funktioniert jetzt. So kann diese Frage geschlossen oder gelöscht werden. – Codek

Antwort

13

Die ntile Funktion ist hier sehr nützlich. Ich habe eine Tabelle 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) ordnet die Spalten nach Punkten, teilt sie in vier Gruppen sogar (wenn die Zahl gleichmäßig teilt) und ordnet die Gruppennummer auf der Grundlage der Bestellung.

Da ich hier 8 Zahlen habe, repräsentieren sie die 0, 12,5, 25, 37,5, 50, 62,5, 75 und 87,5 Perzentile. Wenn ich also nur die Ergebnisse nehme, wo die quartile 2 ist, dann habe ich die 25. und 37.5. Perzentile.

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; 

kehrt 4, die dritthöchste Zahl auf der Liste der 8.

Wenn Sie einen größeren Tisch hatte und verwendet ntile(100) die Spalte Sie die Perzentil gefiltert werden würde, und man konnte die gleiche Abfrage verwenden wie oben.

20

Mit PostgreSQL 9.4 gibt es native Unterstützung für Perzentile jetzt umgesetzt, in Bestellte-Set Aggregatfunktionen:

percentile_cont(fraction) WITHIN GROUP (ORDER BY sort_expression) 

kontinuierlicher Perzentil: Wert wieder in die angegebenen Fraktion in der Bestellung entspricht, Interpolation zwischen benachbarten Eingabeposten wenn

benötigt
percentile_cont(fractions) WITHIN GROUP (ORDER BY sort_expression) 

mult iple kontinuierliche Perzentil: gibt ein Array von Ergebnissen die Form der Fraktionen Parameter, wobei jeder Nicht-Null-Element ersetzt durch den Wert entsprechend dieser Perzentil

In der Dokumentation, um weitere Informationen übereinstimmt, gefunden http://www.postgresql.org/docs/current/static/functions-aggregate.html

und sehen Sie hier für einige Beispiele: https://github.com/michaelpq/michaelpq.github.io/blob/master/_posts/2014-02-27-postgres-9-4-feature-highlight-within-group.markdown

+1

Die Dokumentation hat kein Beispiel. Würde es Ihnen etwas ausmachen, Ihre Antwort mit ein paar einfachen Beispielen zu aktualisieren? Es ist seltsam, aber Googeln hat nur einige komplexe Beispiele ergeben. – tinkerr