Ottieni il 10 ° e il 90 ° percentile dal cliente


13

Ho una tabella che contiene clienti e punteggi (in base a diversi fattori, in questo caso irrilevanti; un cliente può avere più punteggi), che assomiglia a questo:

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

Il score_giver_idè irrilevante, ma mi piace ancora a prenderlo.

Nell'esempio sopra, quando si ottiene il 50o percentile, raggruppato per customer_id, il risultato dovrebbe essere (ho scelto il 50o percentile in questo esempio, perché illustra ciò che voglio fare meglio):

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

Ho usato il metodo descritto qui .

Ho bisogno di ottenere il valore che è al 10 ° percentile, rispettivamente al 90 ° percentile in PostgreSQL. Ho visto che da 9.4 esiste una ntilefunzione, ma non capisco davvero come funziona, cosa fa e se mi aiuta.

Ho trovato un bel frammento per MySQL, che funziona (anche se ci sono alcuni avvertimenti), ma mi piacerebbe usare le funzioni integrate se disponibili (per MySQL non ce ne sono, quindi lo snippet).

Risposte:


22

Sembra che tu stia percentile_disc()cercando la funzione aggregata impostata.

La documentazione dice quanto segue al riguardo:

percentile_disc(fraction) WITHIN GROUP (ORDER BY sort_expression)

percentile discreto: restituisce il primo valore di input la cui posizione nell'ordine è uguale o superiore alla frazione specificata

La sintassi è un po 'strana per un aggregato, ma usarla è semplice:

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

Definisci la colonna da cui prendere il percentile nella ORDER BYclausola.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.