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.
Inhaltsverzeichnis
- 1. Warum AVG allein nicht ausreicht
- 2. Median berechnen mit PERCENTILE_CONT und PERCENTILE_DISC
- 3. Perzentile jenseits des Medians
- 4. Streuung messen: STDDEV und VARIANCE
- 5. Modus und Verteilungsform ohne eingebaute Funktion
- 6. Zusammenhaenge erkennen mit CORR und Regression
- 7. Statistische Funktionen als Window Functions
- 8. Verfuegbarkeit nach Datenbank im Vergleich
- 9. Praxisbeispiel: Ausreisser in Bestelldaten erkennen
- 10. Zusammenfassung
- 11. FAQ
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.