SQL: Median (Zentralwert) einer Spalte ermitteln

Aus DBWiki
Wechseln zu: Navigation, Suche

Zurück zur Übersicht



Um den Median einer Spalte zu finden, kann man abhängig vom SQL-Dialekt entweder eine Unterabfrage, die einen skalaren Wert liefert oder ein Window-Funktionen einsetzen.


Im folgenden soll der Zentralwert aller Gehälter der Abteilung 20 ermittelt werden.

Lösung mittels Unterabfrage

Hinweis für Access-Anwender
Um die folgende Abfrage selbst testen zu können, müssen die Tabellen der Übungsdatenbank vorhanden sein. Null-Werte werden nicht betrachtet.

SELECT Avg( m2.gehalt ) AS median_gehalt
FROM   ( SELECT m0.gehalt 
         FROM   mitarbeiter AS m0,
                mitarbeiter AS m1
         WHERE  m0.abt_nr = m1.abt_nr AND
                m0.abt_nr = 20
         GROUP  BY m0.gehalt
         HAVING Sum( IIf( m0.gehalt = m1.gehalt, 1, 0 ) )
             >= Abs( Sum( Sgn( m0.gehalt - m1.gehalt ) ) ) ) AS m2

Lösung mittels Window Funktion

WITH g AS (
    SELECT gehalt,
           ROW_NUMBER() OVER ( ORDER BY gehalt ) AS rnum,
           ( SELECT COUNT(1)
             FROM   mitarbeiter
             WHERE  abt_nr = 20 ) AS cnt
    FROM   mitarbeiter
    WHERE  abt_nr = 20 )
SELECT avg( gehalt ) AS median_gehalt
FROM   g
WHERE  rnum BETWEEN cnt / 2.0 AND cnt / 2.0 + 1

Für PostgreSQL kann das Ergebnis unter diesem DBFiddle eingesehen werden.


Wikilinks

Weblinks



Zurück zur Übersicht