sql / expert
Snippet
Lösung des Gaps-and-Islands-Problems durch Sequenz-Korrelation
Das 'Gaps and Islands'-Problem besteht darin, zusammenhängende Sequenzen in Daten zu finden. Durch Subtraktion einer monoton steigenden Zeilennummer von einer sortierten Wertesequenz ergeben alle Mitglieder einer kontinuierlichen 'Insel' denselben konstanten Wert ('grp'). Diese Konstante kann dann verwendet werden, um die Grenzen jeder Sequenz zu gruppieren und zu finden.
snippet.sql
1
2
3
4
5
6
SELECT grp, MIN(val) AS start_range, MAX(val) AS end_rangeFROM (SELECT val, val - ROW_NUMBER() OVER(ORDER BY val) AS grpFROM sequences) tGROUP BY grp;
Erklärung
1
ROW_NUMBER() OVER(ORDER BY val)
Generiert eine fortlaufende Ganzzahlsequenz basierend auf den sortierten Werten.
2
val - ROW_NUMBER() ... AS grp
Erzeugt einen konstanten Identifikator für zusammenhängende Werte in der Sequenz.
3
SELECT grp, MIN(val), MAX(val) ... GROUP BY grp
Aggregiert die Gruppen, um den Anfang und das Ende jedes zusammenhängenden Bereichs zu finden.