Получите 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-го процентиля, сгруппированного по customer_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.