Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сцуко задача мозг ломает, помогите  [new]
АвиаДрозд
Guest
Дано:
Есть таблица данными диапазонов
Id	OperatorFrom	OperatorTo	OperatorID
1.		1	              10	1
2.		1		      25	1
3.		2		      8	        1
4.		2		      15	2
5.		50		      60	2
6.		199		      215	2
7.		3		      5	        3

И т.д.
Так вот задача
Необходимо найти пересечения в диапазонах в рамках групп по OperatorID и на выходе получить уникальные не пересекающиеся диапазоны в рамках групп по OperatorID.
Пересекающиеся диапазоны соединить между собой, чтобы включить в итоговый диапазон все диапазоны соединяемых множеств, т.е. min max пересекающегося диапазона.
Вот думаю как эту задачку красиво решит одним запросом без курсоров.
23 июн 09, 13:52    [7333010]     Ответить | Цитировать Сообщить модератору
 Re: Сцуко задача мозг ломает, помогите  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
подсказка: дыры пересекаться не могут

а вообще, поиском наверняка найдете несколько решений
23 июн 09, 13:53    [7333021]     Ответить | Цитировать Сообщить модератору
 Re: Сцуко задача мозг ломает, помогите  [new]
АвиаДрозд
Guest
Паганель
подсказка: дыры пересекаться не могут

а вообще, поиском наверняка найдете несколько решений

Очень оригинально, про дыры ни кто и не говорит, нужно слить пересекающиеся диапазоны и получить их отдельным списком в рамках групп.
23 июн 09, 13:56    [7333044]     Ответить | Цитировать Сообщить модератору
 Re: Сцуко задача мозг ломает, помогите  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
АвиаДрозд
про дыры ни кто и не говорит
возьмите четыре школьных линейки
расположите их на одной прямой,
но первую частично наложите на вторую,
а третьей частично закройте четвертую,
при этом пусть между этими двумя парами будет некоторый промежуток - дыра

представьте, что Вы уже вычислили координаты самых крайних концов линеек
и координаты дыры

теперь понятно?
23 июн 09, 14:02    [7333098]     Ответить | Цитировать Сообщить модератору
 Re: Сцуко задача мозг ломает, помогите  [new]
Бабичев Сергей
Member

Откуда: Красноярск
Сообщений: 2497
АвиаДрозд
Дано:
Есть таблица данными диапазонов
Id	OperatorFrom	OperatorTo	OperatorID
1.		1	              10	1
2.		1		      25	1
3.		2		      8	        1
4.		2		      15	2
5.		50		      60	2
6.		199		      215	2
7.		3		      5	        3

И т.д.
Так вот задача
Необходимо найти пересечения в диапазонах в рамках групп по OperatorID и на выходе получить уникальные не пересекающиеся диапазоны в рамках групп по OperatorID.
Пересекающиеся диапазоны соединить между собой, чтобы включить в итоговый диапазон все диапазоны соединяемых множеств, т.е. min max пересекающегося диапазона.
Вот думаю как эту задачку красиво решит одним запросом без курсоров.


Так, что ли?
with
-- Тестовые данные: 
  t(Id, OperatorFrom, OperatorTo, OperatorID) as 
    (
      select 1,   1,  10, 1 union all
      select 2,   1,  25, 1 union all
      select 3,   2,   8, 1 union all
      select 4,   2,  15, 2 union all
      select 5,  50,  60, 2 union all
      select 6, 199, 215, 2 union all
      select 7,   3,   5, 3
    )
--
-- Основной запрос:
select min(Id) as IdFrom, max(Id) as IdTo, 
       min(OperatorFrom) as OperatorFrom, max(OperatorTo) as OperatorTo, 
       max(OperatorID) as OperatorID
  from (
         select t0.*,
                (
                  select count(case when t2.OperatorFrom is null then 1 end )
                    from t t1
                    left join t t2
                      on t1.OperatorFrom = t2.OperatorTo
                     and t1.OperatorID = t2.OperatorID
                   where t1.OperatorFrom <= t0.OperatorFrom
                ) as grp_id
           from t t0
       ) v         
 group by grp_id
 order by OperatorID;

Результат запроса:
IdfromIdToOperatorFromOperatorToOperatorID
121251
342152
5550602
661992152
77353
23 июн 09, 14:18    [7333193]     Ответить | Цитировать Сообщить модератору
 Re: Сцуко задача мозг ломает, помогите  [new]
Бабичев Сергей
Member

Откуда: Красноярск
Сообщений: 2497
Хотя нет, космато вышло - с упором на "магию данных".
23 июн 09, 14:35    [7333302]     Ответить | Цитировать Сообщить модератору
 Re: Сцуко задача мозг ломает, помогите  [new]
Бабичев Сергей
Member

Откуда: Красноярск
Сообщений: 2497
Вот так лучше попробуй:
with
-- Тестовые данные: 
  t (Id, OperatorFrom, OperatorTo, OperatorID) as 
    (
      select 1,   1,  10, 1 union all
      select 2,   1,  25, 1 union all
      select 3,   2,   8, 1 union all
      select 4,   2,  15, 2 union all
      select 5,  50,  60, 2 union all
      select 6, 199, 215, 2 union all
      select 7,   3,   5, 3 union all
      select 8,   2,   6, 3
    )
--
-- Основной запрос:
select OperatorFrom as OperatorFrom,
       min(v_end.OperatorTo) as OperatorTo,
       v_begin.OperatorID
  from 
       (
          select OperatorFrom, OperatorID
            from t s1
           where not exists (
                               select null
                                 from t s2
                                where s2.OperatorFrom < s1.OperatorFrom
                                  and s2.OperatorTo >= s1.OperatorFrom
                                  and s2.OperatorID = s1.OperatorID
                            )
       ) v_begin,
       (
          select OperatorTo, OperatorID
            from t s1
           where not exists (
                               select null
                                 from t s2
                                where s2.OperatorTo > s1.OperatorTo
                                  and s2.OperatorFrom <= s1.OperatorTo
                                  and s2.OperatorID = s1.OperatorID
                            )
       ) v_end
 where v_begin.OperatorFrom <= v_end.OperatorTo
   and v_begin.OperatorID = v_end.OperatorID
 group by v_begin.OperatorID,v_begin.OperatorFrom
 order by v_begin.operatorid, min(v_end.OperatorTo)
23 июн 09, 14:41    [7333346]     Ответить | Цитировать Сообщить модератору
 Re: Сцуко задача мозг ломает, помогите  [new]
АвиаДрозд
Guest
Всем спасибо попробую применить к боевым данным с ходу логику запроса не разберу , флудеров бы поменьше в форуме типа "Паганель" которые только и могут засирать эфир
23 июн 09, 15:14    [7333577]     Ответить | Цитировать Сообщить модератору
 Re: Сцуко задача мозг ломает, помогите  [new]
aleks2
Guest
АвиаДрозд
Всем спасибо попробую применить к боевым данным с ходу логику запроса не разберу , флудеров бы поменьше в форуме типа "Паганель" которые только и могут засирать эфир

Сам бы сделал - болше пользы бы вышло.

Ты вот лучше скажи: сколько максимальная кратность наложения отрезков?
23 июн 09, 15:23    [7333636]     Ответить | Цитировать Сообщить модератору
 Re: Сцуко задача мозг ломает, помогите  [new]
Kimmy
Member

Откуда: Донецк
Сообщений: 162
2АвиаДрозд
Вам человек алгортм решения расписал, а вы его флудером, не стыдно ?

Impossible is nothing (c) Nike
23 июн 09, 15:23    [7333638]     Ответить | Цитировать Сообщить модератору
 Re: Сцуко задача мозг ломает, помогите  [new]
Ozerov
Member

Откуда: Москва
Сообщений: 3650
АвиаДрозд
Всем спасибо попробую применить к боевым данным с ходу логику запроса не разберу , флудеров бы поменьше в форуме типа "Паганель" которые только и могут засирать эфир


Ех, Вы крайне не правы! А если Вам нужна рыба, а не сеть, боюсь, что ошиблись ресурсом.
23 июн 09, 15:25    [7333651]     Ответить | Цитировать Сообщить модератору
 Re: Сцуко задача мозг ломает, помогите  [new]
АвиаДрозд
Guest
Kimmy
2АвиаДрозд
Вам человек алгортм решения расписал, а вы его флудером, не стыдно ?

Impossible is nothing (c) Nike


Байки о том, как представить эту задачу в виде линек, спичек, километровых столбов и т.д., я и сам представляю и понимаю, что нужно сделать, если хотел помочь пускай бы терминами T-SQL выражался и на конкретные решения указывал. Как в ручную задачу решить и так понятно, а вот не зная всей теории и практики T-SQL сложно, а он про линейки. 
24 июн 09, 09:27    [7335921]     Ответить | Цитировать Сообщить модератору
 Re: Сцуко задача мозг ломает, помогите  [new]
now
Guest
А мне про линейки понравилось!
Очень уж образно и доходчиво ;-)
24 июн 09, 09:43    [7335954]     Ответить | Цитировать Сообщить модератору
 Re: Сцуко задача мозг ломает, помогите  [new]
АвиаДрозд
Guest
now
А мне про линейки понравилось!
Очень уж образно и доходчиво ;-)


Могу Вам в космических парсеках привести пример.
24 июн 09, 10:07    [7336020]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить