Отримайте 10-й та 90-й перцентилі замовник


13

У мене є таблиця, яка містить клієнтів та оцінки (на основі різних факторів, що не мають значення в даному випадку; у клієнта може бути кілька балів), яка виглядає приблизно так:

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_idне має значення, але я все-таки хотів би це отримати.

У наведеному вище прикладі, отримуючи 50-й перцентиль, згрупований за клієнтом_id, результат повинен бути (я вибрав 50-й перцентиль у цьому прикладі, тому що він ілюструє, що я хочу зробити краще):

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

Я використовував описаний тут метод .

Мені потрібно отримати значення, яке знаходиться на 10-му перцентилі, відповідно, на 90-му перцентилі в PostgreSQL. Я бачив, що з 9.4 є ntileфункція, але я не дуже розумію, як вона працює, що робить і чи допомагає мені.

Я знайшов хороший фрагмент для MySQL, який працює (хоча є деякі застереження), але я хотів би використовувати вбудовані функції, якщо вони доступні (для MySQL таких немає, отже, і фрагмент).

Відповіді:


22

Здається, ви перебуваєте після percentile_disc()впорядкованої заданої функції сукупності.

Документація говорить наступне про нього:

percentile_disc(fraction) WITHIN GROUP (ORDER BY sort_expression)

дискретний перцентиль: повертає перше вхідне значення, положення якого в упорядкуванні дорівнює або перевищує вказаний дріб

Синтаксис дещо дивний для сукупності, але використовувати його легко:

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

Ви визначаєте стовпчик, з якого слід взяти відсоток у ORDER BYпункті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.