capypad
0 Tage Serie
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
sql
1
2
3
4
5
6
SELECT grp, MIN(val) AS start_range, MAX(val) AS end_range
FROM (
SELECT val, val - ROW_NUMBER() OVER(ORDER BY val) AS grp
FROM sequences
) t
GROUP 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.