2017-04-15 6 views
1

Ich brauche Medianwert in Spalte "Median". Irgendwelche Ideen, bitte?Wie wird der Medianwert extrahiert?

SELECT 
MIN(score) min, CAST(AVG(score) AS float) median, MAX(score) max 
FROM result JOIN student ON student.id = result.student_id 
+0

Mögliches Duplikat von [Funktion, um Median in Sql Server zu berechnen] (http://stackoverflow.com/questions/1342898/) Funktion-zu-berechnen-Median-in-SQL-Server) –

+1

Bitte markieren Sie Ihre Frage mit der Datenbank, die Sie verwenden. –

+0

Entschuldigung. Ich benutze PostgreSQL 9.6 – nikita100k

Antwort

1

Ich denke, die einfachste Methode PERCENTILE_CONT() oder PERCENTILE_DISC() ist:

SELECT MIN(score) as min_score, 
     PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY score) as median_score, 
     MAX(score) max_score 
FROM result r JOIN 
    student s 
    ON s.id = r.student_id; 

Dies setzt voraus (nach billigem Ermessen), dass score numerisch ist. Der Unterschied zwischen PERCENTILE_CONT() und PERCENTILE_DISC() ist, was passiert, wenn es eine gerade Anzahl von Werten gibt. Das ist normalerweise eine unbedeutende Überlegung, es sei denn, Sie haben eine kleine Menge an Daten.

+0

Vielen Dank. Ich hatte keine Ahnung, dass eine solche Funktion überhaupt existiert (PERCENTILE_COUNT). – nikita100k

0

Durchschnitt ist nicht Median, du hast Recht. Sie können es die genaue Art und Weise tun, mit:

SELECT ( (SELECT MIN(score) FROM Results X 
      WHERE (SELECT COUNT(*) FROM Results Y WHERE Y.score<= X.score) 
        >= (SELECT COUNT(*) FROM Results)/2) 
     + (SELECT MAX(num) FROM Results X 
      WHERE (SELECT COUNT(*) FROM Results Y WHERE Y.score >= X.score) 
        >= (SELECT COUNT(*) FROM Results)/2) 
     )/2 AS median 

Diese Griffe der Fall, wo die Grenze zwischen dem oberen und unteren 50% zwischen zwei Werten; willkürlich nimmt sie den Mittelweg zwischen ihnen als Median. Es gibt Argumente, warum diese etwas höher oder niedriger gewichtet werden könnten, aber jeder Wert in diesem Intervall teilt die Population korrekt in zwei Teile.

Oder, wenn Sie mit einer hyperbolischen Verteilung zu tun hat, gibt es eine Abkürzung Annäherung:

SELECT SQRT(SUM(num)/SUM(1.0/num)) FROM List 

Viele andere realen Distributionen viele kleine Mitglieder haben und ein paar großen Mitglieder. Nachdem Sie SAVE gedrückt und die vorherige Antwort gesehen haben: Ja, SQL2003 gibt Ihnen jetzt etwas einfacheres :-)

Verwandte Themen