Есть отрезки. Они могут разнообразно пересекаться, так, что левая и правая границы могут:
1. Быть обе внутри другого отрезка: 0-5 и 0-8
2. Только одна из границ внутри другого отрезка, тогда как вторая граница - во вне: 1-5 и 4-8
3. Находиться рядом: 0-5 и 6-10
4. Находиться на расстоянии: 1-5 и 7-10
Задача: найти левую и правую границы, сложив пересекающиеся и смежные отрезки.
Я разделил построчно отрезки в исходной таблице, которые должны быть объединены в один отрезок
То есть на выходе должно получиться
Но приведенный селект это не решение. Это просто перебор решения.
Как я понимаю, наверное тут нужна рекурсия. Или как?
1. Быть обе внутри другого отрезка: 0-5 и 0-8
2. Только одна из границ внутри другого отрезка, тогда как вторая граница - во вне: 1-5 и 4-8
3. Находиться рядом: 0-5 и 6-10
4. Находиться на расстоянии: 1-5 и 7-10
Задача: найти левую и правую границы, сложив пересекающиеся и смежные отрезки.
Я разделил построчно отрезки в исходной таблице, которые должны быть объединены в один отрезок
;WITH tb (a,b) AS ( SELECT a,b from (VALUES(1,3),(2,5),(2,6),(7,10),(8,10),(0,7), (13,15),(12,17),(13,100), (150,200),(160,201))a(a,b) ) SELECT distinct MIN(t1.a),MAX(t2.b) FROM tb t1 CROSS APPLY tb t2 WHERE t1.a - t2.a <= 1 AND (t1.a BETWEEN t2.a AND t2.b OR t2.a BETWEEN t1.a AND t1.b) and t2.a - t1.b <= 1 and t2.b - t1.b >=1 GROUP by CASE WHEN t1.a < t2.a THEN t1.a else 0 END, CASE WHEN t1.b < t2.b THEN t2.b else 0 END
То есть на выходе должно получиться
|
Но приведенный селект это не решение. Это просто перебор решения.
Как я понимаю, наверное тут нужна рекурсия. Или как?