Gaps & Islands: Lücken in Nummernfolgen
nr - ROW_NUMBER() OVER (ORDER BY nr) ist innerhalb einer lückenlosen Folge konstant und springt bei jeder Lücke. Nach dieser Differenz gruppieren ergibt die Inseln. Die Lücken liefert LEAD(nr): Ist die nächste Nummer größer als nr + 1, fehlt etwas.🧪 Ausprobieren – Vorher / Nachher
SQL-Engine wird geladen …
🌍 Dialekte nebeneinander
Ausgeführt werden nur SQLite (sql.js) und – wo markiert – PostgreSQL (PGlite). MySQL/MariaDB, SQL Server und Oracle sind nach der offiziellen Dokumentation geschrieben, laufen hier aber nicht.
SELECT MIN(nr), MAX(nr) FROM (SELECT nr, nr - ROW_NUMBER() OVER (ORDER BY nr) AS insel FROM rechnungen) t GROUP BY insel;
SELECT MIN(nr), MAX(nr) FROM (SELECT nr, nr - ROW_NUMBER() OVER (ORDER BY nr) AS insel FROM rechnungen) t GROUP BY insel;
SELECT MIN(nr), MAX(nr) FROM (SELECT nr, nr - ROW_NUMBER() OVER (ORDER BY nr) AS insel FROM rechnungen) t GROUP BY insel;
SELECT MIN(nr), MAX(nr) FROM (SELECT nr, nr - ROW_NUMBER() OVER (ORDER BY nr) AS insel FROM rechnungen) GROUP BY insel;
Oracle erlaubt kein AS vor Tabellen-Aliasen.
SELECT MIN(nr), MAX(nr) FROM (SELECT nr, nr - ROW_NUMBER() OVER (ORDER BY nr) AS insel FROM rechnungen) GROUP BY insel;
⚠️ Fallstricke
- Bei Datumsfolgen (Login-Serien) funktioniert dasselbe mit
datum - ROW_NUMBER()als Tage – die Datumsarithmetik ist aber dialektabhängig (julianday()in SQLite,date - integerin PostgreSQL). - Gibt es doppelte Werte,
DENSE_RANK()stattROW_NUMBER()nehmen – sonst zerfällt eine Insel.
📚 Belege
- SQLite: Window Functions – Window Functions seit 3.25.0, ROWS/RANGE
- PostgreSQL: Set Returning Functions – generate_series
- MySQL: Window Functions – Window Functions in MySQL 8.0