2016-06-06 5 views
4

Eigentlich habe ich Verständnis dafür, wie PERCENTILE_CONT funktioniert, aber ich bekomme ein anderes Ergebnis durch Perzentilen per Hand berechnen und durch Aufruf einer Funktion. Hier ist der Datensatz:SQL. Unerwartetes Ergebnis des Aufrufs von PERCENTILE_CONT Funktion

305.7884804 
350 
373.3728865 
384.2094838 
410.8603441 
414.9842786 
455.3545205 
550 

zu 25% berechnen ich resümieren 350 und 373.3728865 und dann teilen sie durch 2. Das Ergebnis ist 361.68644325.

Um 50% zu berechnen, summiere ich und 410.8603441 und dividiere es dann durch 2. Und das Ergebnis ist 397.53491395.

Um 75% zu berechnen, summiere ich 414.9842786 und 455.3545205 und dann dividiere es durch 2. Und das Ergebnis ist 435.16939955.

Allerdings, wenn ich diese SQL ausführen:

select 
percentile_cont(0.25) within group(order by YEAR_2_FTE ASC), 
percentile_cont(0.5) within group(order by YEAR_2_FTE ASC), 
percentile_cont(0.75) within group(order by YEAR_2_FTE ASC) from sr_database 
where firm_id=999; 

ich ein solches Ergebnis:

25%: 367,529664875
50%: 397,53491395
75%: 425,076839075

Was bin ich falsch singen?

Antwort

4

Sie nehmen den Punkt auf halbem Wege zwischen dem 4. und 5. Wert, um das 50. Perzentil zu berechnen. Aber den halben Punkt zwischen dem 2. und 3. für das 25. Perzentil (und ähnlich für das 75.) zu nehmen, ist nicht korrekt. Dies wird am besten mit einer Abbildung zu sehen:

enter image description here

Dies zeigt, 8 Punkte und 4 Linien zwischen ihnen gezogen 4 gleich große Segmente zu machen. Die 25. und 75. Perzentilmarker fallen näher an den 3. bzw. 6. Wert heran.

Die Oracle documentation beschrieben, wie diese berechnet werden:

Das Ergebnis PERCENTILE_CONT wird berechnet durch lineare Interpolation zwischen den Werten sie nach der Bestellung. Unter Verwendung des Perzentilwerts (P) und der Anzahl von Zeilen (N) in der Aggregationsgruppe berechnen wir die Zeile Nummer, an der wir interessiert sind, nachdem die Zeilen in Bezug auf die Sortierspezifikation angeordnet wurden. Diese Zeilennummer (RN) wird gemäß der Formel RN = (1+ (P * (N - 1)) berechnet. Das Endergebnis der Aggregatfunktion wird durch lineare Interpolation zwischen den Werten aus Zeilen bei Zeilennummern berechnet CRN = CEILING (RN) und FRN = FLOOR (RN).

In Ihrem Beispiel für das 25. Perzentil P = 0.25 und N = 8 so:

Das Endergebnis:

RN = (1+ 0.25*(8-1)) 
    = 2.75 

So CRN = 3 und FRN = 2

Die Dokumentation zu sagen, geht wird sein:

If (CRN = FRN = RN), dann ist das Ergebnis

(value of expression from row at RN) 

ansonsten ist das Ergebnis

(CRN - RN) * (value of expression for row at FRN) + 

(RN - FRN) * (value of expression for row at CRN) 

ist oben in den Werten Anstecken, die "Sonst ..." Teil gilt für die Berechnung dh:

Result = (3 - 2.75) * 350 + (2.75 - 2) * 373.3728856 
     = 367.5296642 

Und in ähnlicher Weise für das 75. Perzentil:

RN = (1+ 0.75*(8-1)) 
    = 6.25 
CRN = 7 
FRN = 6 
Result = (7 - 6.25) * 414.9842786 + (6.25 - 6) * 455.3545205 
     = 425.076839075 
+0

Vielen Dank für die Erklärung. Soweit ich weiß, gibt es keine eingebaute Funktion, die so funktioniert, wie ich es erwartet habe. PERCENTILE_DISC arbeitet mit diskreten Daten. –

+1

Denken Sie, dass die Absicht, die Mittelwerte für das 25. und 75. Perzentil zu verwenden, fehlerhaft ist. Um das zu verstehen, sehen Sie bitte, ob Sie eine Formel für das * n * -te Perzentil erstellen können, während Sie daran arbeiten, wobei * n * eine beliebige Zahl zwischen 0 und 100 sein kann ... –

+1

Update: Haben Sie eine Illustration hinzugefügt die Antwort, um dies hoffentlich klarer zu machen. –

Verwandte Themen