Erhalten Sie das 10. und 90. Perzentil nach Kunden


13

Ich habe eine Tabelle mit Kunden und Bewertungen (basierend auf verschiedenen Faktoren, in diesem Fall irrelevant; ein Kunde kann mehrere Bewertungen haben), die so aussieht:

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

Das score_giver_idist irrelevant, aber ich würde es trotzdem gerne holen.

Im obigen Beispiel sollte das Ergebnis sein, wenn das 50. Perzentil, gruppiert nach customer_id, abgerufen wird (in diesem Beispiel habe ich das 50. Perzentil ausgewählt, da es veranschaulicht, was ich besser machen möchte):

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

Ich habe die hier beschriebene Methode angewendet .

Ich muss den Wert abrufen, der beim 10. Perzentil bzw. beim 90. Perzentil in PostgreSQL liegt. Ich habe gesehen, dass es seit 9.4 eine ntileFunktion gibt, aber ich verstehe nicht wirklich, wie es funktioniert, was es tut und ob es mir hilft.

Ich habe ein schönes Snippet für MySQL gefunden, das funktioniert (obwohl es einige Einschränkungen gibt), aber ich würde gerne eingebaute Funktionen verwenden, falls verfügbar (für MySQL gibt es keine, daher das Snippet).

Antworten:


22

Es scheint, dass Sie nach der percentile_disc()Aggregatfunktion für geordnete Mengen suchen.

In der Dokumentation heißt es dazu:

percentile_disc(fraction) WITHIN GROUP (ORDER BY sort_expression)

diskretes Perzentil: Gibt den ersten Eingabewert zurück, dessen Position in der Reihenfolge dem angegebenen Bruch entspricht oder diesen überschreitet

Die Syntax ist für ein Aggregat etwas seltsam, aber die Verwendung ist einfach:

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

In der ORDER BYKlausel definieren Sie die Spalte, aus der das Perzentil entnommen werden soll.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.