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

Откуда:
Сообщений: 25
Есть пара не уникальных значений, действующая в определенный момент времени - дата старта и дата окончания действия.
Как выбрать полный интервал действия пары? Проблема в том что изменение пары происходит не всегда + после некоторого периода она может принимать повторные значения т.е. мин-макс не пойдет - будет пересечение интервалов.
Необходимый результат из примера
52000 38052 27.07.2004 14:57 - 15.11.2004 15:08
52000 20052 15.11.2004 15:08 - 06.05.2005 12:18
и тд

52000 38052 27.07.2004 14:57 15.11.2004 15:08
52000 20052 15.11.2004 15:08 28.12.2004 10:41
52000 20052 28.12.2004 10:41 06.05.2005 12:18
5201 20052 06.05.2005 12:18 06.05.2005 12:23
5201 21052 06.05.2005 12:23 06.05.2005 14:57
5201 21052 06.05.2005 14:57 25.05.2005 12:36
5201 21052 25.05.2005 12:36 25.05.2005 13:23
5201 21052 25.05.2005 13:23 01.06.2005 11:51
5201 21052 01.06.2005 11:51 27.06.2005 15:29
5201 21052 27.06.2005 15:29 07.10.2005 16:17
5201 21052 07.10.2005 16:17 17.10.2005 14:35
5202 21052 17.10.2005 14:35 14.02.2006 11:16
5202 21052 14.02.2006 11:16 04.04.2006 12:07
5202 21052 04.04.2006 12:07 06.04.2006 10:27
5202 21052 06.04.2006 10:27 07.04.2006 10:43
5202 21052 07.04.2006 10:43 11.04.2006 11:25
5202 21052 11.04.2006 11:25 12.04.2006 11:32
5202 21052 12.04.2006 11:32 13.09.2006 9:27
5202 21052 13.09.2006 9:27 16.10.2006 13:16
5202 21052 16.10.2006 13:16 17.10.2006 18:30
5202 21052 17.10.2006 18:30 17.01.2007 12:46
5202 21052 17.01.2007 12:46 22.01.2007 18:11
5202 21052 22.01.2007 18:11 15.02.2007 10:48
5202 21052 15.02.2007 10:48 26.03.2007 9:48
5202 21052 26.03.2007 9:48 26.04.2007 14:53
5202 21052 26.04.2007 14:53 31.07.2007 9:37
5202 21052 31.07.2007 9:37 31.07.2007 9:56
5202 21052 31.07.2007 9:56 30.01.2008 17:45
5202 21052 30.01.2008 17:45 12.03.2008 12:37
5202 21052 12.03.2008 12:37 21.03.2008 10:26
5202 21052 21.03.2008 10:26 07.04.2008 10:20
5202 21052 07.04.2008 10:20 07.04.2008 11:24
5202 21052 07.04.2008 11:24 24.04.2008 14:30
5202 21052 24.04.2008 14:30 30.04.2008 8:08
5202 21052 30.04.2008 8:08 11.06.2008 16:23
5202 21052 11.06.2008 16:23 17.06.2008 10:17
5202 21052 17.06.2008 10:17 09.07.2008 18:21
5202 21052 09.07.2008 18:21 14.10.2008 17:53
5202 21052 14.10.2008 17:53 17.11.2008 16:37
5202 21052 17.11.2008 16:37 08.12.2008 10:12
5202 21052 08.12.2008 10:12 15.12.2008 16:18
5202 21052 15.12.2008 16:18 09.02.2009 16:20
5202 21052 09.02.2009 16:20 17.02.2009 11:16
5202 21052 17.02.2009 11:16 10.03.2009 10:25
5202 21052 10.03.2009 10:25 10.03.2009 17:02
5202 21052 10.03.2009 17:02 11.03.2009 14:49
5202 21052 11.03.2009 14:49 12.03.2009 9:53
5202 21052 12.03.2009 9:53 17.03.2009 13:11
5202 21052 17.03.2009 13:11 09.06.2010 11:26
5252 21052 09.06.2010 11:26 17.11.2010 17:54
5252 21052 17.11.2010 17:54 22.11.2010 12:44
5252 21052 22.11.2010 12:44 02.03.2011 15:43
5252 21052 02.03.2011 15:43 20.04.2011 13:25
5252 21052 20.04.2011 13:25 03.05.2011 17:37
5252 21052 03.05.2011 17:37 04.05.2011 10:48
5252 21052 04.05.2011 10:48 25.05.2011 11:56
5252 21052 25.05.2011 11:56 22.02.2012 13:02
5202 21052 22.02.2012 13:02 25.03.2012 16:08
5202 21052 25.03.2012 16:08 27.03.2012 11:14
5202 21052 27.03.2012 11:14 14.05.2012 15:36
5202 21052 14.05.2012 15:36 15.05.2012 12:16
4 июл 12, 17:50    [12817897]     Ответить | Цитировать Сообщить модератору
 Re: Собрать интервал из отрезков  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
philipp1,

Вот теперь эту простыню занесите в таблицу или табличную переменнную. По мне так с таким подходом, даже думать противно о решении
4 июл 12, 18:05    [12818004]     Ответить | Цитировать Сообщить модератору
 Re: Собрать интервал из отрезков  [new]
aleks2
Guest
declare @t table(id int, n int, bg datetime, en datetime, nn int identity primary key clustered);

insert @t 
select 
52000, 38052, '20040727 14:57', '20041115 15:08'
union all
select 
52000, 20052, '20041115 15:08', '20041228 10:41'
union all
select 
52000, 20052, '20041228 10:41', '20050506 12:18'

;with
-- начала интервалов непрерывности
ib as (select t.id, t.n, t.bg, ROW_NUMBER() over(PARTITION by t.id, t.n  order by t.bg) ord 
         from @t t 
              left outer join 
              @t t1 
              on t.bg between t1.bg and t1.en and t.nn <> t1.nn and t.id = t1.id and t.n=t1.n
         where t1.id is null
       )
,
-- концы интервалов непрерывности
ie as (select t.id, t.n, t.en, ROW_NUMBER() over(PARTITION by t.id, t.n order by t.en) ord 
         from @t t 
              left outer join 
              @t t1 
              on t.en between t1.bg and t1.en and t.nn <> t1.nn and t.id = t1.id  and t.n=t1.n 
         where t1.id is null
       )
-- и делов то
select ib.id, ib.n, ib.bg, ie.en from ib inner join ie on ib.id = ie.id and ib.n=ie.n and ib.ord=ie.ord
order by ib.bg
4 июл 12, 18:23    [12818119]     Ответить | Цитировать Сообщить модератору
 Re: Собрать интервал из отрезков  [new]
philipp1
Member

Откуда:
Сообщений: 25
aleks2,
Спасибо. С этого края не пробовал.
12 июл 12, 10:26    [12854610]     Ответить | Цитировать Сообщить модератору
 Re: Собрать интервал из отрезков  [new]
philipp1
Member

Откуда:
Сообщений: 25
philipp1,
А как "расширить" интервалы если значения не изменялись?
Т.е для значений 5202,21052 у нас есть 2 интервала, но тк изменений не было их можно заменить одним
'20050506 12:23:47' - '20100609 11:26:47'

with tbl as (
      select      5202 as f1,21052 as f2,'20120222 13:02:31' as d_start,'20120515 12:16:23' as d_end    union all
      select      5252,21052,'20100609 11:26:47','20120222 13:02:31'   union all
      select      5202,21052,'20051017 14:35:28','20100609 11:26:47'   union all
      select      5202,21052,'20050506 12:23:47','20051017 14:35:28'   union all
      select      52000,20052,'20041115 15:08:01','20050506 12:18:06'  union all
      select      52000,38052,'20040727 14:57:50','20041115 15:08:01' 
)

select
      *
from
      tbl
12 июл 12, 10:31    [12854636]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить