Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Опять интервалы, сегментация  [new]
HResult
Member

Откуда:
Сообщений: 132
Нужен набор функций построения динамической сегментации на SQL сервере.

Сама задача:

Есть таблица трубопроводов
idPipeline, Start, Finish

Есть набор таблиц, в которых хранятся интервалы разных типов:
Id, idPipeline, Start, Finish

Надо построить динамическую сегментацию вдоль трубопровода

Пример:
Трубопровод
1, 0, 10000

Интервал Тип 1
1, 1, 100, 200
2, 1, 4000, 5000
3, 1, 6000, 8000

Интервал Тип 2
1, 1, 150, 2000
2, 1, 3000, 5500
3, 1, 7000, 9000

Динамическая сегментация – это новый перечень интервалов, которые строятся таким образом, что два последовательных интервала отличаются количеством и составом пересекающихся по расстоянию исходных интервалов.
После того, как новый перечень интервалов построен, надо будет рассчитать некий параметр (назовем его Score) для каждого нового интервала. Этот Score будет рассчитываться как сумма всех Score входящих в него интервалов с учетом веса (коэффициента) типа этого интервала.
Типов интервалов в одной пачке может быть больше двух.

Предполагается, что результатом будут наборы SQL скриптов (MS SQL и ORACLE), желательно без использования хранимых процедур.

Возможно ли это?

Картинка:

К сообщению приложен файл. Размер - 65Kb
13 окт 13, 01:40    [14962312]     Ответить | Цитировать Сообщить модератору
 Re: Опять интервалы, сегментация  [new]
LR
Member

Откуда: 8P8C
Сообщений: 2423
HResult
Возможно ли это?

Описание задачи трудно понять, но если судить по картинке, то задачу можно свести к получению "картины" пересечений отрезков разного типа (веса), представляя результат как список всех точек (начала и концы отрезков) со значениями веса слева и справа от точки
declare @t table (start int, finish int, weight int) -- таблица отрезков "с весом"
insert @t
select 100, 200, 1 union all
select 4000, 5000, 1 union all
select 6000, 8000, 1 union all
select 150, 2000, 2 union all
select 3000, 5500, 2 union all
select 7000, 9000, 2 union all
select 200, 500, 4 union all
select 4500, 5100, 4 union all
select 7900, 8000, 4

select p.x, p.leftweight+isnull(sum(t.weight),0) [leftweight], p.rightweight+isnull(sum(t.weight),0) [rightweight]
from (
	-- все точки с "собственными" значениями веса слева и справа
	select v.x, sum(v.lweight) [leftweight], sum(v.rweight) [rightweight] from (
		select start [x], 0 [lweight], weight [rweight] from @t union all
		select finish, weight, 0 from @t
	) v group by v.x
) p left join @t t on p.x > t.start and p.x < t.finish -- попадание точки в "чужой" отрезок
group by p.x, p.leftweight, p.rightweight
order by p.x
13 окт 13, 15:00    [14962851]     Ответить | Цитировать Сообщить модератору
 Re: Опять интервалы, сегментация  [new]
HResult
Member

Откуда:
Сообщений: 132
Спасибо, все работает, как на картинке. Картинка - большое дело.
Проверил на реальных объемах - больше 100 тыс интервалов - сервер отказывается, говорит не хватает ресурсов.
Но это не проблема.
Проблема, что у меня на входе, оказывается, пересекающиеся или даже двойные интервалы.
Их, как бы, быть не должно, но, вот, есть.
Надо было бы их собрать в поглощаюший интервал с максимальным весом перед сегментацией.
Буду думать.
14 окт 13, 12:14    [14965890]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить