2013-01-14 18 views
14

Zaskakująco nie mogę znaleźć nth percentyla funkcji dla postgresql.nth percentyla obliczenia w postgresql

Używam tego za pomocą narzędzia mondrian olap, więc potrzebuję funkcji agregującej, która zwraca 95 percentyla.

znalazłem ten link:

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

Ale z jakiegoś powodu kod z tą funkcją percentyla powraca null w niektórych przypadkach z pewnymi zapytaniami. Sprawdziłem dane i nie ma w nich nic dziwnego, co mogłoby to spowodować!

+1

Czy wypróbowałeś 'percent_rank()', 'cume_dist()' lub 'ntile()'? Szczegóły [tutaj] (http://www.postgresql.org/docs/current/static/functions-window.html). –

+2

Zobacz także: http: // stackoverflow.com/a/14309370/330315 –

+0

Ach, znalazłem inny wpis przepełnienia stosu, ale nie utworzyłem funkcji sortowania tablic. Teraz działa. Pytanie to może zostać zamknięte lub usunięte. – Codek

Odpowiedz

13

Funkcja ntile jest tutaj bardzo przydatna. Mam tabeli 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) nakazuje kolumny przez wynik, dzieli je na cztery grupy nawet (jeśli liczba dzieli równomiernie) i przypisuje numer grupy w oparciu o zlecenia.

Ponieważ mam tutaj 8 liczb, reprezentują one 0, 12,5, 25, 37,5, 50, 62, 50, 75 i 87,5 percentyla. Jeśli więc przyjmę tylko wyniki, gdzie quartile wynosi 2, będę miał 25 i 37,5 percentyla.

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; 

powraca 4, trzeci najwyższy numer na liście 8.

jeśli miał większy stół i używane ntile(100) kolumna filtrować na byłaby percentyla, i można używać tego samego zapytania jak powyżej.

20

Z PostgreSQL 9.4 jest natywne wsparcie dla percentyla obecnie realizowany w Zamówione ustawione funkcje agregujące:

percentile_cont(fraction) WITHIN GROUP (ORDER BY sort_expression) 

ciągły percentyla: zwraca wartość odpowiadającą określonej frakcji w kolejności, interpolację między sąsiednimi elementów wejściowych razie potrzeby

percentile_cont(fractions) WITHIN GROUP (ORDER BY sort_expression) 

mult iple ciągłego percentyla: zwraca tablicy wyników odpowiadających kształt parametru frakcje, z których każdy nie-zerowej elementu zastępowana jest przez wartość odpowiadającą tej percentyla

zapoznać się z dokumentacją więcej: http://www.postgresql.org/docs/current/static/functions-aggregate.html

i zobacz tutaj dla niektórych przykładów: https://github.com/michaelpq/michaelpq.github.io/blob/master/_posts/2014-02-27-postgres-9-4-feature-highlight-within-group.markdown

+1

Dokumentacja nie ma przykładu. Czy mógłbyś zaktualizować swoją odpowiedź kilkoma prostymi przykładami? To dziwne, ale Googling dał tylko kilka skomplikowanych przykładów. – tinkerr