Bei der Arbeit mit relationalen Datenbanken tritt häufig das Bedürfnis auf, aus jeder Gruppe, die mit dem GROUP BY
-Befehl erstellt wurde, eine bestimmte Anzahl von Datensätzen abzurufen. Leider unterstützen SQL-Standards wie SQL-92 das direkte Hinzufügen von LIMIT
innerhalb eines GROUP BY
nicht. Dies erfordert kreative Lösungsansätze, um die gewünschten Ergebnisse zu erzielen.
Grundlagen:
Angenommen, wir haben eine Tabelle namens verkauf
mit Spalten produkt
, verkaufsdatum
und betrag
. Wenn wir die Top-2-Verkäufe für jedes Produkt nach Betrag erhalten möchten, können wir dies nicht direkt mit einem einfachen GROUP BY
und LIMIT
tun.
Lösungsansatz:
Eine gängige Methode zur Lösung dieses Problems ist die Verwendung von fensterbasierten Funktionen (Window Functions). Hier ist ein Beispiel, wie dies erreicht werden kann:
WITH Ranking AS (
SELECT
produkt,
verkaufsdatum,
betrag,
ROW_NUMBER() OVER(PARTITION BY produkt ORDER BY betrag DESC) as rang
FROM verkauf
)
SELECT
produkt,
verkaufsdatum,
betrag
FROM Ranking
WHERE rang <= 2;
In diesem Beispiel wird die ROW_NUMBER()
-Funktion verwendet, um eine Rangfolge für jeden Verkauf innerhalb einer Produktgruppe basierend auf dem betrag
in absteigender Reihenfolge zu erstellen. Der Common Table Expression (CTE) namens Ranking
gibt uns dann die Möglichkeit, nur die Top-2-Verkäufe für jedes Produkt zu filtern.
Zusammenfassung:
Obwohl SQL-Standardfunktionen keine direkte Möglichkeit bieten, ein LIMIT
innerhalb eines GROUP BY
zu verwenden, ermöglichen fensterbasierte Funktionen dennoch die effiziente Abfrage von N Ergebnissen pro Gruppe. Es ist wichtig, den Datenbankkontext und die verfügbaren Funktionen zu kennen, um solche fortgeschrittenen Anforderungen effizient zu bewältigen.