Quantcast
Channel: SQL.ru: Microsoft SQL Server
Viewing all articles
Browse latest Browse all 7251

Поиск min и max границ пересекающихся отрезков

$
0
0
Есть отрезки. Они могут разнообразно пересекаться, так, что левая и правая границы могут:
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

То есть на выходе должно получиться
ab
010
12100
150201


Но приведенный селект это не решение. Это просто перебор решения.
Как я понимаю, наверное тут нужна рекурсия. Или как?

Viewing all articles
Browse latest Browse all 7251

Trending Articles