Obtenga el percentil 10 y 90 por cliente


13

Tengo una tabla que contiene clientes y puntajes (basada en diferentes factores, irrelevantes en este caso; un cliente puede tener múltiples puntajes), que se ve así:

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

El score_giver_ides irrelevante, pero todavía me gustaría buscarlo.

En el ejemplo anterior, al obtener el percentil 50, agrupado por customer_id, el resultado debería ser (elegí el percentil 50 en este ejemplo, porque ilustra lo que quiero hacer mejor):

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

Usé el método descrito aquí .

Necesito obtener el valor que está en el percentil 10, respectivamente, en el percentil 90 en PostgreSQL. He visto que desde 9.4 hay una ntilefunción, pero realmente no entiendo cómo funciona, qué hace y si me ayuda.

He encontrado un buen fragmento para MySQL, que funciona (a pesar de que hay algunas advertencias), pero me gustaría usar funciones incorporadas si están disponibles (para MySQL no hay ninguno, de ahí el fragmento).

Respuestas:


22

Parece que buscas la percentile_disc()función agregada de conjunto ordenado.

La documentación dice lo siguiente al respecto:

percentile_disc(fraction) WITHIN GROUP (ORDER BY sort_expression)

percentil discreto: devuelve el primer valor de entrada cuya posición en el pedido es igual o superior a la fracción especificada

La sintaxis es un poco extraña para un agregado, pero usarla es fácil:

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

Defina la columna desde la cual tomar el percentil en la ORDER BYcláusula.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.