2015-01-11 3 views
5

I Tabelle Timings genannt, wo wir 1 Million Antwortzeiten für Lasttests speichern, jetzt müssen wir diese Daten in 100 Gruppen einzuteilen, dh - erste 500 Datensätze als eine Gruppe und so weiter, und berechnen Perzentil jeder Gruppe, anstatt Durchschnitt.wie Perzentil in Postgres berechnen

bisher habe ich versucht, diese Abfrage

Select quartile 
    , avg(data) 
    , max(data) 
    FROM (

     SELECT data 
      , ntile(500) over (order by data) as quartile 
      FROM data 
     ) x 
GROUP BY quartile 
ORDER BY quartile 

aber wie habe ich das Perzentil finden

Antwort

6

ntile ist, wie man Perzentile (unter anderem n-Fliesen, wie Quartil, Dezil berechnet, etc.).

ntile Gruppen der Tisch in die angegebene Anzahl von Buckets so gleichmäßig wie möglich ist. Wenn Sie 4 Buckets angeben, wäre das ein Quartil. 10 wäre ein Dezil.

Für Perzentil, würden Sie die Anzahl der Schaufeln auf sein 100.

Ich bin nicht sicher, wo die 500 hier kommt ... wenn Sie die Perzentil Ihre Daten bestimmen wollen, ist in (also teilen Sie die Millionen Zeiten so gleichmäßig wie möglich in 100 Eimer), würden Sie ntile mit einem Argument von 100 verwenden, und die Gruppen würden mehr als 500 Einträge haben.

Wenn Sie sich nicht um avg noch max kümmern, können Sie einen Haufen von Ihrer Abfrage fallen lassen. So wäre es etwa so aussehen:

SELECT data, ntile(100) over (order by data) AS percentile 
FROM data 
ORDER BY data 
+0

Jede Gruppe enthält 500 Datensätze, da es 100 Gruppen geben würde ... also wird ntile automatisch das Perzentil berechnen? für jede Gruppe? – lampdev

+0

Nicht sicher, was Sie unter "jede Gruppe enthält 500 Datensätze" verstehen. Welche Gruppen? Alle Ihre Daten befinden sich in der 'data' Tabelle. 'ntile (100)' auf diesen Daten werden die Daten in 100 Gruppen einteilen, jedoch werden viele Zeilen dies sein. Und so würde man das Perzentil für jede gegebene Datenmenge berechnen. Wenn Sie es zuerst in 500 Gruppen aufgeteilt haben, dann ist das kein Perzentil mehr ... – khampson

+0

Wir müssen ein Perzentildiagramm zeichnen, das von asc zu desc order geht. Tabelle enthält 50.000 Timings, jetzt müssen wir diese 50.000 Timings in teilen Gruppen und berechnen Perzentil für jede Gruppe, ich bin etwas verwirrt darüber. oder wie können wir dies erreichen – lampdev

4

Normalerweise, wenn Sie die Perzentil wissen wollen, sind Sie sicherer mit cume_dist als ntile. Das liegt daran, dass sich ntile bei wenigen Eingaben merkwürdig verhält. Bedenken Sie:

=# select v, 
      ntile(100) OVER (ORDER BY v), 
      cume_dist() OVER (ORDER BY v) 
    FROM (VALUES (1), (2), (4), (4)) x(v); 

v | ntile | cume_dist 
---+-------+----------- 
1 |  1 |  0.25 
2 |  2 |  0.5 
4 |  3 |   1 
4 |  4 |   1 

Sie können sehen, dass ntile nur die ersten 4 von 100 Eimer verwendet, wo cume_dist gibt Ihnen immer eine Zahl von 0 bis 1. Wenn Sie also das 99. Perzentil, um herauszufinden möchten, können Sie einfach schmeiss alles weg mit einem cume_dist unter 0,99 und nimm den kleinsten v von dem was übrig ist.

Wenn Sie auf Postgres sind 9.4+, dann percentile_cont and percentile_disc machen es noch leichter, weil Sie den Eimer nicht selbst konstruieren müssen. Ersteres bietet sogar Interpolation zwischen Werten, was wiederum nützlich sein kann, wenn Sie einen kleinen Datensatz haben.