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

Откуда:
Сообщений: 4
Добрый день!

Есть Microsoft SQL Server 2000 - 8.00.2187.

На сервере есть таблица с идентификатором, значением и интервалом действия:
create table #tmp (
  ID_var 	tinyint, 
  Val_var	char(1),
  Beg_dt	datetime,
  End_dt 	datetime
)

Известно, что интервалы действия для каждого идентификатора не пересекаются. Но в некоторых случаях интервалы можно объединить. Например, здесь можно объединить строчки 1 и 2:
insert into #tmp values (1, 'A', '20090801', '20090831')
insert into #tmp values (1, 'A', '20090901', '20090930')
insert into #tmp values (1, 'B', '20091001', '20091015')
insert into #tmp values (1, 'A', '20091016', '20091031')

Необходимо получить таблицу вида:
ID_varVal_varBeg_dtEnd_dt
1A2009-08-01 00:00:00.0002009-09-30 00:00:00.000
1B2009-10-01 00:00:00.0002009-10-15 00:00:00.000
1A2009-10-16 00:00:00.0002009-10-31 00:00:00.000


Очень хочется получить результат с помощью одного SQL-запроса. Если это невозомжно или сложно / громоздко, готов рассмотреть другие варианты. Пока ничего кроме курсора придумать не получилось :(. Может быть коллективный разум что-нибудь подскажет?


Спасибо.
28 сен 09, 09:57    [7713907]     Ответить | Цитировать Сообщить модератору
 Re: Объединение интервалов  [new]
Добрый Э - Эх
Guest
Основная идея озвучена тут: тынц
28 сен 09, 10:07    [7713944]     Ответить | Цитировать Сообщить модератору
 Re: Объединение интервалов  [new]
LexMinsk
Member

Откуда: Republic of Belarus
Сообщений: 451
Посмотри тут [url=]https://www.sql.ru/forum/actualthread.aspx?tid=683073&hl=lexminsk[/url]
28 сен 09, 10:23    [7714023]     Ответить | Цитировать Сообщить модератору
 Re: Объединение интервалов  [new]
Anddros
Member

Откуда:
Сообщений: 1077
select id_var, val_var, min(beg_dt) beg_dt, max(end_dt) end_dt
from (
select t1.id_var, t1.val_var, t1.beg_dt, t1.end_dt,
  count(*)-sum(case when t1.val_var=t2.val_var then 1 else 0 end) cou
from #tmp t1
inner join #tmp t2 on t1.id_var=t2.id_var and t1.beg_dt>=t2.beg_dt
group by t1.id_var, t1.val_var, t1.beg_dt, t1.end_dt
)t
group by id_var, val_var, cou
28 сен 09, 10:25    [7714039]     Ответить | Цитировать Сообщить модератору
 Re: Объединение интервалов  [new]
G.A.G.
Member

Откуда:
Сообщений: 4
Anddros,

Спасибо. Это то, что нужно !!!
28 сен 09, 14:44    [7715606]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить