Obtenha os percentis 10 e 90 por cliente

13

Eu tenho uma tabela que contém clientes e pontuações (com base em diferentes fatores, irrelevantes neste caso; um cliente pode ter várias pontuações), com a seguinte aparência:

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

O score_giver_idé irrelevante, mas eu ainda gostaria de buscá-lo.

No exemplo acima, ao obter o 50º percentil, agrupado por customer_id, o resultado deve ser (escolhi o 50º percentil neste exemplo, porque ilustra o que eu quero fazer melhor):

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

Eu usei o método descrito aqui .

Preciso obter o valor que está no percentil 10, respectivamente no percentil 90 no PostgreSQL. Eu vi que desde a 9.4 existe uma ntilefunção, mas eu realmente não entendo como ela funciona, o que faz e se isso me ajuda.

Encontrei um bom trecho para o MySQL, que funciona (mesmo que haja algumas ressalvas), mas eu gostaria de usar funções internas, se disponíveis (para o MySQL não há nenhuma, portanto, o trecho).

Eduard Luca
fonte

Respostas:

22

Parece que você está atrás da percentile_disc()função agregada definida por ordem.

A documentação diz o seguinte sobre isso:

percentile_disc(fraction) WITHIN GROUP (ORDER BY sort_expression)

percentil discreto: retorna o primeiro valor de entrada cuja posição na ordem é igual ou superior à fração especificada

A sintaxe é um pouco estranha para um agregado, mas é fácil usá-lo:

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

Você define a coluna da qual obter o percentil na ORDER BYcláusula.

dezso
fonte