Zdobądź 10. i 90. percentyl według klienta

13

Mam tabelę, która zawiera klientów i wyniki (oparte na różnych czynnikach, nieistotne w tym przypadku; klient może mieć wiele wyników), który wygląda następująco:

customer_id | score | score_giver_id
====================================
          1 | 100   | 1
          1 | 102   | 1
          1 | 101   | 1
          1 | 140   | 1
          2 | 131   | 3
          1 | 44    | 1
          3 | 223   | 1
          3 | 1     | 2
          3 | 201   | 1
          3 | 211   | 1
          3 | 231   | 1
          3 | 243   | 1

To nie score_giver_idma znaczenia, ale nadal chciałbym je pobrać.

W powyższym przykładzie podczas pobierania 50 percentyla pogrupowanego według ID_klienta powinien być wynik (wybrałem 50 percentyl w tym przykładzie, ponieważ ilustruje to, co chcę zrobić lepiej):

customer_id | score | score_giver_id
====================================
          1 | 101   | 1
          2 | 131   | 3
          3 | 223   | 1

Użyłem opisanej tutaj metody .

Muszę uzyskać wartość, która wynosi 10 percentyl, odpowiednio 90 percentyl w PostgreSQL. Widziałem to od wersji 9.4, ale jest taka ntilefunkcja, ale tak naprawdę nie rozumiem, jak to działa, co robi i czy mi to pomaga.

Znalazłem ładny fragment kodu dla MySQL, który działa (nawet jeśli są pewne zastrzeżenia), ale chciałbym użyć wbudowanych funkcji, jeśli są dostępne (dla MySQL nie ma, stąd fragment).

Eduard Luca
źródło

Odpowiedzi:

22

Wygląda na to, że szukasz percentile_disc()funkcji agregującej zestaw uporządkowany.

Dokumentacja mówi o tym, co następuje:

percentile_disc(fraction) WITHIN GROUP (ORDER BY sort_expression)

dyskretny percentyl: zwraca pierwszą wartość wejściową, której pozycja w porządku jest równa lub większa niż określony ułamek

Składnia jest nieco dziwna dla agregatu, ale korzystanie z niego jest łatwe:

SELECT percentile_disc(0.9) WITHIN GROUP (ORDER BY score)
  FROM customer_score
 GROUP BY customer_id;

Zdefiniuj kolumnę, z której chcesz pobrać percentyl w ORDER BYklauzuli.

dezso
źródło