Obtenez les 10e et 90e centiles par client

13

J'ai un tableau qui contient les clients et les scores (basé sur différents facteurs, non pertinent dans ce cas; un client peut avoir plusieurs scores), qui ressemble à ceci:

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

Le score_giver_idn'est pas pertinent, mais j'aimerais quand même le chercher.

Dans l'exemple ci-dessus, lors de l'obtention du 50e centile, groupé par customer_id, le résultat devrait être (j'ai choisi le 50e centile dans cet exemple, car il illustre ce que je veux faire mieux):

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

J'ai utilisé la méthode décrite ici .

J'ai besoin d'obtenir la valeur qui se situe au 10e centile, respectivement au 90e centile dans PostgreSQL. J'ai vu que depuis 9.4 il y a une ntilefonction, mais je ne comprends pas vraiment comment cela fonctionne, ce qu'elle fait et si cela m'aide.

J'ai trouvé un bel extrait pour MySQL, qui fonctionne (même s'il y a quelques mises en garde), mais j'aimerais utiliser des fonctions intégrées si disponibles (pour MySQL il n'y en a pas, d'où l'extrait).

Eduard Luca
la source

Réponses:

22

Il semble que vous recherchiez la percentile_disc()fonction d'agrégation d'ensemble ordonné.

La documentation dit ce qui suit à ce sujet:

percentile_disc(fraction) WITHIN GROUP (ORDER BY sort_expression)

percentile discret: renvoie la première valeur d'entrée dont la position dans l'ordre est égale ou supérieure à la fraction spécifiée

La syntaxe est un peu étrange pour un agrégat, mais son utilisation est simple:

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

Vous définissez la colonne à partir de laquelle prendre le centile dans la ORDER BYclause.

dezso
la source