Dapatkan persentil ke 10 dan 90 oleh pelanggan

13

Saya memiliki tabel yang berisi pelanggan dan skor (berdasarkan faktor yang berbeda, tidak relevan dalam kasus ini; pelanggan dapat memiliki beberapa skor), yang terlihat seperti ini:

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

Itu score_giver_idtidak relevan, tetapi saya masih ingin mengambilnya.

Dalam contoh di atas, ketika mendapatkan persentil ke-50, yang dikelompokkan berdasarkan customer_id, hasilnya seharusnya (saya memilih persentil ke-50 dalam contoh ini, karena menggambarkan apa yang ingin saya lakukan lebih baik):

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

Saya menggunakan metode yang dijelaskan di sini .

Saya perlu mendapatkan nilai yang berada pada persentil ke-10, masing-masing pada persentil ke-90 di PostgreSQL. Saya telah melihat bahwa sejak 9.4 ada ntilefungsi, tetapi saya tidak benar-benar mengerti cara kerjanya, apa fungsinya, dan jika itu membantu saya.

Saya telah menemukan cuplikan yang bagus untuk MySQL, yang berfungsi (walaupun ada beberapa peringatan), tetapi saya ingin menggunakan fungsi bawaan jika tersedia (untuk MySQL tidak ada, maka cuplikannya).

Eduard Luca
sumber

Jawaban:

22

Tampaknya Anda mencari percentile_disc()fungsi agregat yang diatur-atur.

The dokumentasi mengatakan berikut tentang hal ini:

percentile_disc(fraction) WITHIN GROUP (ORDER BY sort_expression)

diskrit persentil: mengembalikan nilai input pertama yang posisinya dalam urutan sama dengan atau melebihi fraksi yang ditentukan

Sintaksnya agak aneh untuk agregat, tetapi menggunakannya mudah:

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

Anda menentukan kolom dari mana untuk mengambil persentil dalam ORDER BYklausa.

dezso
sumber