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

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

Столкнулся со следующей проблемой:
есть таблица вида
id value1 date_from date_to
1 1 01.01.2001 05.02.2003
1 1 06.02.2003 08.03.2005
1 2 09.03.2005 11.11.2010
1 1 12.11.2010 15.02.2015

Из нее необходимо получить таблицу вида
id value1 date_from date_to
1 1 01.01.2001 08.03.2005
1 2 09.03.2005 11.11.2010
1 1 12.11.2010 15.02.2015

Т.е. "свернуть" даты

И аналогичный пример, с одним изменением:
Исходная таблица
id value2 date
1 45 02.05.2007
1 45 03.05.2007
1 45 04.05.2007
1 45 05.05.2007
1 13 06.05.2007
1 13 07.05.2007
1 45 08.05.2007

Итоговая таблица:
id value2 date_from date_to
1 45 02.05.2007 05.05.2007
1 13 06.05.2007 07.05.2007
1 45 08.05.2007 08.05.2007
5 мар 15, 11:31    [17345704]     Ответить | Цитировать Сообщить модератору
 Re: Схлопывание записей по дате  [new]
не совсем понятно...
Guest
xostyle,

оформление плохое, переделал... Вот смотрите, исходные данные
есть таблица вида
id	value1	date_from	date_to
1	1	01.01.2001	05.02.2003
1	1	06.02.2003	08.03.2005
1	2	09.03.2005	11.11.2010
1	1	12.11.2010	15.02.2015

Из нее необходимо получить таблицу вида
id	value1	date_from	date_to
1	1	01.01.2001	08.03.2005
1	2	09.03.2005	11.11.2010
1	1	12.11.2010	15.02.2015


Исходная таблица
id	value2	date
1	45	02.05.2007
1	45	03.05.2007
1	45	04.05.2007
1	45	05.05.2007
1	13	06.05.2007
1	13	07.05.2007
1	45	08.05.2007

Итоговая таблица:
id	value2	date_from	date_to
1	45	02.05.2007	05.05.2007
1	13	06.05.2007	07.05.2007
1	45	08.05.2007	08.05.2007


Тут по какому принципу сортируются id и value? По столбцу первой даты?
5 мар 15, 12:15    [17346002]     Ответить | Цитировать Сообщить модератору
 Re: Схлопывание записей по дате  [new]
инвариант,
Guest
xostyle,

инвариант

declare @t table(id int, value2 int, date datetime)

insert into @t
select 1,	45,	'20070502' union all
select 1,	45,	'20070503' union all
select 1,	45,	'20070504' union all
select 1,	45,	'20070505' union all
select 1,	13,	'20070506' union all
select 1,	13,	'20070507' union all
select 1,	45,	'20070508' 

select id, value2, min(date) as date_from, max(date) as date_to
from
	(select *,
	row_number()over(order by date)-row_number()over(partition by id, value2 order by date)as gr
	from @t) t
group by id, value2, gr
order by 1,3

id          value2      date_from               date_to
----------- ----------- ----------------------- -----------------------
1 45 2007-05-02 00:00:00.000 2007-05-05 00:00:00.000
1 13 2007-05-06 00:00:00.000 2007-05-07 00:00:00.000
1 45 2007-05-08 00:00:00.000 2007-05-08 00:00:00.000
5 мар 15, 12:23    [17346044]     Ответить | Цитировать Сообщить модератору
 Re: Схлопывание записей по дате  [new]
xostyle
Member

Откуда:
Сообщений: 4
Для случая, если исходно дат 2, а не 1 (from + to)
Подходит и для случая с одной, кстати.

declare @t table(id int, value2 int, date_from datetime, date_to datetime)


select id, value2, min(date_from) as date_from, max(date_to) as date_to
from
	(select *,
	row_number()over(partition by id, value2 order by date)-row_number()over(partition by id order by date)as gr
	from @t) t
group by id, value2, gr
order by 1,3
20 мар 15, 14:26    [17410014]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить