Statistische Funktionen in SQL nutzen: Median, Perzentile, Streuung
AI generated
SELECT
JOIN
SQL · Aggregation · Reporting
Statistische Funktionen in SQL nutzen
Median, Streuung und Korrelation ohne Python-Export

AVG allein erzaehlt selten die ganze Geschichte einer Datenverteilung. Mit statistischen Funktionen wie PERCENTILE_CONT, STDDEV und CORR lassen sich Median, Streuung und Zusammenhaenge direkt in der Datenbank berechnen, ohne Rohdaten nach Python oder R exportieren zu muessen.

18 Min. Lesezeit PERCENTILE_CONT · STDDEV · VARIANCE · CORR PostgreSQL · MySQL 8 · SQL Server · Oracle

1. Warum AVG allein nicht ausreicht

Der Durchschnitt, berechnet mit AVG, ist die am haeufigsten genutzte Kennzahl in SQL-Reports, aber er verzerrt das Bild, sobald Ausreisser in den Daten vorhanden sind. Ein einzelner Grossauftrag kann den durchschnittlichen Bestellwert einer ganzen Region nach oben verzerren, obwohl die typische Bestellung deutlich kleiner ist. Genau hier setzen statistische Funktionen in SQL an: Sie liefern robustere und aussagekraeftigere Kennzahlen als der reine Mittelwert.

Der Median etwa ist gegenueber Ausreissern deutlich robuster als AVG, weil er den mittleren Wert einer sortierten Verteilung beschreibt, statt alle Werte gleichgewichtet zu summieren. Statistische Funktionen in SQL wie PERCENTILE_CONT, STDDEV und VARIANCE erlauben es, solche robusteren Kennzahlen direkt in der Datenbank zu berechnen, ohne die Rohdaten in ein externes Statistik-Tool exportieren zu muessen.

Der praktische Vorteil, statistische Funktionen in SQL direkt in der Datenbank statt in der Anwendungsschicht zu berechnen, liegt in der Effizienz: Die Datenbank verarbeitet die Rohdaten ohnehin, und eine zusaetzliche Aggregatberechnung kostet deutlich weniger als der Transport aller Einzelwerte ueber das Netzwerk in ein separates Analyse-Tool.

2. Median berechnen mit PERCENTILE_CONT und PERCENTILE_DISC

Der Median ist der Wert, der eine sortierte Verteilung genau in der Mitte teilt, sodass die Haelfte der Werte darunter und die Haelfte darueber liegt. In PostgreSQL, Oracle und SQL Server wird der Median mit der Funktion PERCENTILE_CONT(0.5) innerhalb einer WITHIN GROUP Klausel berechnet. PERCENTILE_CONT interpoliert zwischen zwei benachbarten Werten, wenn die exakte Mitte zwischen zwei Datenpunkten liegt, waehrend PERCENTILE_DISC immer einen tatsaechlich vorhandenen Wert aus der Verteilung zurueckgibt.

Der Unterschied zwischen PERCENTILE_CONT und PERCENTILE_DISC ist bei geraden Verteilungsgroessen relevant: Bei einer geraden Anzahl Werte liegt der mathematische Median genau zwischen den beiden mittleren Werten, was PERCENTILE_CONT durch Interpolation korrekt abbildet, waehrend PERCENTILE_DISC stattdessen einen der beiden benachbarten Originalwerte auswaehlt. Fuer echte statistische Genauigkeit ist PERCENTILE_CONT die richtige Wahl, fuer die Auswahl eines tatsaechlich existierenden Datensatzes PERCENTILE_DISC.


-- PostgreSQL / Oracle: median with interpolation
SELECT
    produkt_kategorie,
    PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY bestellwert) AS median_bestellwert,
    AVG(bestellwert) AS durchschnitt_bestellwert
FROM bestellungen
GROUP BY produkt_kategorie;

-- MySQL 8 has no native PERCENTILE_CONT — simulate with window functions
SELECT DISTINCT
    produkt_kategorie,
    PERCENT_RANK() OVER (PARTITION BY produkt_kategorie ORDER BY bestellwert) AS rang
FROM bestellungen;

MySQL kennt bis Version 8.0 keine native PERCENTILE_CONT Funktion und benoetigt eine manuelle Loesung ueber Window Functions wie ROW_NUMBER und COUNT, um die mittlere Zeile einer sortierten Gruppe zu identifizieren. Diese manuelle Median-Berechnung ist umstaendlicher, aber funktional aequivalent zu PERCENTILE_CONT in den anderen Datenbanken.

3. Perzentile jenseits des Medians

PERCENTILE_CONT akzeptiert jeden Wert zwischen 0 und 1, nicht nur 0.5 fuer den Median. Ein Wert von 0.9 liefert das 90. Perzentil, also den Wert, unter dem 90 Prozent aller Beobachtungen liegen. Diese Kennzahl ist besonders relevant bei Performance-Metriken wie Ladezeiten, wo das p95 oder p99 Perzentil aussagekraeftiger ist als der Durchschnitt, weil es zeigt, wie schlecht die Erfahrung fuer die langsamsten Nutzer tatsaechlich ist.

In der Praxis werden mehrere Perzentile oft gemeinsam in einer Abfrage berechnet, um ein vollstaendiges Bild der Verteilung zu erhalten: das 25., 50., 75. und 95. Perzentil zusammen zeigen sowohl die zentrale Tendenz als auch die Streuung an den Raendern der Verteilung. Diese Kombination aus mehreren statistischen Funktionen in SQL ersetzt oft einen kompletten Boxplot, ohne ein separates Visualisierungstool zu benoetigen.


-- Multiple percentiles in a single query
SELECT
    produkt_kategorie,
    PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY antwortzeit_ms) AS p25,
    PERCENTILE_CONT(0.50) WITHIN GROUP (ORDER BY antwortzeit_ms) AS p50,
    PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY antwortzeit_ms) AS p75,
    PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY antwortzeit_ms) AS p95
FROM anfragen_log
WHERE datum >= CURRENT_DATE - INTERVAL '7 days'
GROUP BY produkt_kategorie;

4. Streuung messen: STDDEV und VARIANCE

Waehrend Median und Perzentile die Lage einer Verteilung beschreiben, messen STDDEV und VARIANCE, wie stark die Werte um den Mittelwert streuen. Die Standardabweichung, berechnet mit STDDEV() oder in PostgreSQL alternativ STDDEV_SAMP(), ist die Quadratwurzel der Varianz und wird in derselben Einheit wie die Ursprungsdaten ausgedrueckt, was ihre Interpretation erleichtert. Diese statistische Funktion in SQL ist unverzichtbar, um zu beurteilen, ob ein Durchschnittswert eine homogene oder eine stark schwankende Gruppe repraesentiert.

Ein wichtiger Unterschied betrifft die Wahl zwischen Stichproben- und Populationsvarianz. STDDEV_SAMP() und VAR_SAMP() teilen durch n minus 1 und sind die richtige Wahl, wenn die vorliegenden Daten eine Stichprobe einer groesseren Grundgesamtheit sind. STDDEV_POP() und VAR_POP() teilen durch n und sind korrekt, wenn die Daten die vollstaendige Population selbst darstellen, etwa alle Bestellungen eines geschlossenen Zeitraums.


-- Standard deviation and variance, sample vs population
SELECT
    region,
    AVG(bestellwert) AS durchschnitt,
    STDDEV_SAMP(bestellwert) AS std_stichprobe,
    STDDEV_POP(bestellwert) AS std_population,
    VAR_SAMP(bestellwert) AS varianz_stichprobe
FROM bestellungen
GROUP BY region
HAVING COUNT(*) > 1;  -- STDDEV_SAMP requires at least 2 rows per group

Ein haeufiger Fehler: STDDEV_SAMP() mit nur einer Zeile in der Gruppe liefert NULL, da die Formel durch n minus 1 gleich null teilt. Wer diese Faelle nicht mit einer HAVING-Bedingung ausschliesst, bekommt NULL-Werte in Gruppen mit nur einer Beobachtung, was in nachgelagerten Berechnungen zu unerwarteten Ergebnissen fuehren kann.

5. Modus und Verteilungsform ohne eingebaute Funktion

Anders als Median und Standardabweichung besitzt der Modus, also der haeufigste Wert einer Verteilung, in den meisten Datenbanken keine eingebaute Aggregatfunktion. Der Modus laesst sich dennoch mit einer Kombination aus GROUP BY, COUNT und ORDER BY simulieren: Man gruppiert nach dem betrachteten Wert, zaehlt die Haeufigkeit, sortiert absteigend nach dieser Haeufigkeit und nimmt die oberste Zeile.

Fuer die Form einer Verteilung, etwa Schiefe (Skewness) oder Woelbung (Kurtosis), bieten nur wenige Datenbanken native Funktionen. Oracle stellt hierfuer eigene Funktionen bereit, PostgreSQL und MySQL benoetigen manuell konstruierte Formeln auf Basis von Potenzen und AVG. Fuer die meisten Reporting-Anwendungsfaelle reichen Median, Perzentile und Standardabweichung jedoch aus, um eine Verteilung ausreichend zu charakterisieren, ohne auf komplexere Kennzahlen wie Schiefe zurueckgreifen zu muessen.


-- Mode: most frequent value, simulated without a built-in function
SELECT bestellwert_gerundet, COUNT(*) AS haeufigkeit
FROM (
    SELECT ROUND(bestellwert, -1) AS bestellwert_gerundet
    FROM bestellungen
) AS gerundete_werte
GROUP BY bestellwert_gerundet
ORDER BY haeufigkeit DESC
LIMIT 1;

6. Zusammenhaenge erkennen mit CORR und Regression

Neben Lage und Streuung einzelner Spalten interessiert oft der Zusammenhang zwischen zwei Spalten. Die Funktion CORR(spalte_a, spalte_b) berechnet den Pearson-Korrelationskoeffizienten und liefert einen Wert zwischen minus eins und eins. Ein Wert nahe eins deutet auf einen starken positiven Zusammenhang hin, ein Wert nahe minus eins auf einen starken negativen Zusammenhang, und ein Wert nahe null auf keinen linearen Zusammenhang.

PostgreSQL und Oracle bieten zusaetzlich Regressionsfunktionen wie REGR_SLOPE() und REGR_INTERCEPT(), die eine einfache lineare Regression direkt in SQL berechnen. Diese statistischen Funktionen in SQL sind nuetzlich, um schnelle Trendanalysen durchzufuehren, etwa ob ein Zusammenhang zwischen Marketingausgaben und Umsatz besteht, ohne die Daten in ein separates Statistik-Tool exportieren zu muessen.


-- Correlation and simple linear regression directly in SQL
SELECT
    CORR(marketing_ausgaben, umsatz) AS korrelation,
    REGR_SLOPE(umsatz, marketing_ausgaben) AS steigung,
    REGR_INTERCEPT(umsatz, marketing_ausgaben) AS achsenabschnitt,
    REGR_R2(umsatz, marketing_ausgaben) AS bestimmtheitsmass
FROM monatswerte;

7. Statistische Funktionen als Window Functions

Alle bisher gezeigten statistischen Funktionen in SQL lassen sich auch als Window Functions mit einer OVER Klausel verwenden, statt Zeilen zu einer einzigen Gruppe zusammenzufassen. Das erlaubt, den Median oder die Standardabweichung einer Gruppe neben jeder einzelnen Detailzeile anzuzeigen, was fuer Ausreisser-Erkennung besonders nuetzlich ist: Jede Zeile kann direkt mit dem gruppenweiten Durchschnitt und der Standardabweichung verglichen werden, ohne einen zusaetzlichen Self-Join zu benoetigen.

Diese Technik wird oft fuer die Z-Score-Berechnung genutzt, ein Standardmass fuer die Entfernung eines Werts vom Mittelwert in Einheiten der Standardabweichung. Ein Z-Score ueber 2 oder unter minus 2 markiert typischerweise einen statistischen Ausreisser, der eine naehere Untersuchung verdient.


-- Z-score per row, using window functions instead of a self-join
SELECT
    bestellung_id,
    bestellwert,
    AVG(bestellwert) OVER (PARTITION BY region) AS durchschnitt_region,
    STDDEV_SAMP(bestellwert) OVER (PARTITION BY region) AS std_region,
    (bestellwert - AVG(bestellwert) OVER (PARTITION BY region))
        / NULLIF(STDDEV_SAMP(bestellwert) OVER (PARTITION BY region), 0) AS z_score
FROM bestellungen;

8. Verfuegbarkeit nach Datenbank im Vergleich

Die Unterstuetzung fuer statistische Funktionen in SQL unterscheidet sich deutlich zwischen den grossen Datenbanksystemen. PostgreSQL und Oracle bieten die breiteste native Unterstuetzung, einschliesslich Perzentile, Standardabweichung, Varianz, Korrelation und Regressionsfunktionen. SQL Server unterstuetzt PERCENTILE_CONT, STDDEV und VARIANCE, aber keine nativen REGR-Funktionen. MySQL hat erst mit Version 8.0 STDDEV und VARIANCE eingefuehrt, PERCENTILE_CONT fehlt bis heute vollstaendig.

Funktion PostgreSQL MySQL 8 SQL Server Oracle
PERCENTILE_CONT Ja Nein Ja Ja
STDDEV / VARIANCE Ja Ja Ja Ja
CORR Ja Nein Nein Ja
REGR_SLOPE / REGR_R2 Ja Nein Nein Ja

9. Praxisbeispiel: Ausreisser in Bestelldaten erkennen

Ein vollstaendiges Praxisbeispiel kombiniert mehrere statistische Funktionen in SQL, um Ausreisser in Bestelldaten automatisiert zu erkennen. Statt manuell durch Tausende Bestellungen zu scrollen, filtert die Abfrage direkt alle Bestellungen heraus, deren Wert mehr als zwei Standardabweichungen vom regionalen Durchschnitt abweicht. Diese Technik wird haeufig in Betrugserkennung und Qualitaetskontrolle eingesetzt, weil sie automatisch auf regionale Unterschiede in der Bestellgroesse reagiert, statt einen einzigen globalen Schwellenwert zu verwenden.

Die Kombination aus Window Functions fuer die gruppenbezogene Statistik und einer abschliessenden WHERE-Bedingung auf den berechneten Z-Score zeigt, wie statistische Funktionen in SQL praktische Probleme loesen, die sonst ein separates Analyse-Skript erfordern wuerden.


-- Detect statistical outliers using a two-standard-deviation threshold
WITH mit_zscore AS (
    SELECT
        bestellung_id,
        region,
        bestellwert,
        (bestellwert - AVG(bestellwert) OVER (PARTITION BY region))
            / NULLIF(STDDEV_SAMP(bestellwert) OVER (PARTITION BY region), 0) AS z_score
    FROM bestellungen
)
SELECT bestellung_id, region, bestellwert, ROUND(z_score, 2) AS z_score
FROM mit_zscore
WHERE ABS(z_score) > 2
ORDER BY ABS(z_score) DESC;

Mironsoft

SQL-Reporting, Datenmodellierung und Query-Optimierung

Statistische Auswertungen nur ueber Python-Export moeglich?

Wir bauen SQL-Abfragen mit Median, Perzentilen, Standardabweichung und Korrelation direkt in eurer Datenbank, ohne Export und ohne zusaetzliche Statistik-Pipeline.

Statistik-Queries

Median, Perzentile und Streuungsmasse in bestehende Reports einbauen

Ausreisser-Erkennung

Automatisierte Z-Score-Analysen fuer Betrugserkennung und Qualitaetskontrolle

Datenbank-Migration

Statistische Funktionen zwischen Datenbanksystemen portieren

10. Zusammenfassung

Statistische Funktionen in SQL ermoeglichen es, robustere Kennzahlen als den reinen Durchschnitt direkt in der Datenbank zu berechnen. PERCENTILE_CONT liefert Median und beliebige Perzentile, STDDEV und VARIANCE messen die Streuung um den Mittelwert, und CORR sowie die REGR-Funktionen zeigen lineare Zusammenhaenge zwischen zwei Spalten. Als Window Functions eingesetzt, koennen dieselben Funktionen gruppenweite Kennzahlen direkt neben jeder Detailzeile anzeigen, was Ausreisser-Erkennung mit Z-Scores ohne Self-Join ermoeglicht.

Die Verfuegbarkeit dieser Funktionen unterscheidet sich stark zwischen Datenbanken: PostgreSQL und Oracle bieten die vollstaendigste Unterstuetzung, MySQL bleibt bei Perzentilen und Korrelation eingeschraenkt. Wer statistische Funktionen in SQL konsequent nutzt, spart den Umweg ueber externe Analyse-Tools fuer viele alltaegliche Reporting-Fragen.

Statistische Funktionen in SQL — Das Wichtigste auf einen Blick

Median & Perzentile

PERCENTILE_CONT(0.5) WITHIN GROUP fuer den Median, robuster gegen Ausreisser als AVG.

Streuung

STDDEV_SAMP fuer Stichproben, STDDEV_POP fuer vollstaendige Populationen.

Korrelation

CORR() liefert Pearson-Koeffizient zwischen minus eins und eins fuer zwei Spalten.

Ausreisser

Z-Score mit Window Functions berechnen, Werte ueber 2 oder unter minus 2 naeher pruefen.

11. FAQ: Statistische Funktionen in SQL

1Median in SQL berechnen?
Mit PERCENTILE_CONT(0.5) WITHIN GROUP. MySQL braucht eine manuelle Loesung mit Window Functions.
2PERCENTILE_CONT vs. PERCENTILE_DISC?
CONT interpoliert zwischen Werten, DISC gibt einen echten Wert zurueck. Fuer Genauigkeit CONT bevorzugen.
3Warum robuster als AVG?
Der Median beschreibt nur die Mitte der Verteilung und wird von einzelnen Ausreissern kaum beeinflusst.
4STDDEV_SAMP oder STDDEV_POP?
SAMP fuer Stichproben, POP fuer die vollstaendige Population selbst.
5Was liefert CORR()?
Pearson-Koeffizient zwischen minus eins und eins fuer den linearen Zusammenhang zweier Spalten.
6MySQL Perzentile und Korrelation?
Nein, beide fehlen nativ und muessen mit Window Functions manuell nachgebildet werden.
7Z-Score direkt in SQL?
Mit Window Functions: Wert minus Durchschnitt, geteilt durch Standardabweichung, NULLIF verhindert Division durch null.
8STDDEV_SAMP bei einer Zeile?
Liefert NULL, da n minus 1 gleich null ist. Solche Gruppen mit HAVING COUNT(*) > 1 ausschliessen.
9Lineare Regression in SQL?
In PostgreSQL und Oracle mit REGR_SLOPE, REGR_INTERCEPT, REGR_R2. SQL Server und MySQL nicht nativ.
10Wofuer eignet sich der Z-Score?
Fuer automatisierte Ausreisser-Erkennung, etwa bei Betrugserkennung oder Qualitaetskontrolle.