Müşteri tarafından 10. ve 90. persentilleri alın


13

Müşteriler ve puanları içeren bir tablo var (farklı faktörlere dayanarak, bu durumda ilgisiz; bir müşterinin birden fazla puanı olabilir), bu şöyle görünüyor:

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

score_giver_idAlakasız, ama yine de almak istediğiniz.

Yukarıdaki örnekte, customer_id ile gruplandırılmış 50. yüzdelik dilimi alırken sonuç şu olmalıdır (daha iyi yapmak istediklerimi gösteren bu örnekte 50. yüzdelik dilimi seçtim):

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

Burada açıklanan yöntemi kullandım .

PostgreSQL 10th persentil, sırasıyla 10th persentil, değer almak gerekir. 9.4'ten beri bir ntilefonksiyon olduğunu gördüm , ama nasıl çalıştığını, ne yaptığını ve bana yardımcı olup olmadığını gerçekten anlamıyorum.

(Bazı uyarılar olmasına rağmen) çalışan MySQL için güzel bir snippet buldum, ancak varsa (MySQL için hiçbiri yok, bu nedenle snippet) yerleşik işlevleri kullanmak istiyorum.

Yanıtlar:


22

Peşinde görünüyor percentile_disc()sipariş-set toplama işlevi.

Dokümantasyon bu konuda şunları söylüyor:

percentile_disc(fraction) WITHIN GROUP (ORDER BY sort_expression)

ayrık yüzdelik değer: sıralamadaki konumu belirtilen kesriye eşit veya aşan ilk girdi değerini döndürür

Sözdizimi bir küme için biraz garip, ancak kullanımı kolaydır:

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

Maddede yüzdelik dilimin alınacağı sütunu tanımlarsınız ORDER BY.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.