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

Откуда:
Сообщений: 658
create  table #t (date date, status varchar(20), id_klient bigint)
alter table #t ADD CONSTRAINT Uniq UNIQUE (id_klient, date)

insert into #t (date, status, id_klient)
	values	('2011-01-01', 'открыт', 1),
			('2012-01-01', 'закрыт', 1),
			('2013-01-01', 'снова открыт', 1),
			('2013-10-15', 'опять закрыт', 1),
			('2013-10-15', 'открыт', 2)


Необходимо получить inline функцию с параметрами "@Period_Status_Begin as date" и "@Period_Status_End as date", которая вернет при
@Period_Status_Begin = '2013-10-01'
@Period_Status_End = '2013-10-31'

id_klient status date_beg date_end
1снова открыт 2013-10-01 2013-10-14
1опять закрыт 2013-10-15 2013-10-31
2открыт2013-10-15 2013-10-31



В таблице около 600 000 строк статусов на 300 000 клиентов
23 окт 13, 16:35    [15021982]     Ответить | Цитировать Сообщить модератору
 Re: Развернуть колонку дат в две колнки - начало конец периода  [new]
Galyamov Rinat
Member

Откуда:
Сообщений: 658
Как наиболее оптимально добавить дату конца периода?
Остальное вроде бы работает.

declare @Period_Status_Begin as date = '2013-10-01', @Period_Status_End as date  = '2013-10-31'

	select id_klient, status, @Period_Status_Begin as date_beg
		from #t t1
		where t1.date in (select max(t2.Date)
									from #t as t2
									where t1.id_klient=t2.id_klient and t2.Date<=@Period_Status_Begin)
	union all
	select id_klient, status, date as date_beg
		from #t t1
		where t1.date > @Period_Status_Begin and t1.date <= @Period_Status_End
23 окт 13, 17:09    [15022225]     Ответить | Цитировать Сообщить модератору
 Re: Развернуть колонку дат в две колнки - начало конец периода  [new]
Добрый Э - Эх
Guest
самое простое - lead/lag, если версия сервера позволяет
23 окт 13, 17:09    [15022226]     Ответить | Цитировать Сообщить модератору
 Re: Развернуть колонку дат в две колнки - начало конец периода  [new]
Galyamov Rinat
Member

Откуда:
Сообщений: 658
Добрый Э - Эх,

Получается, типа так:
declare @Period_Status_Begin as date = '2013-10-01', @Period_Status_End as date  = '2013-10-31'

select id_klient, status, date_beg, ISNULL(LEAD (date_beg) over (partition by id_klient order by date_beg), @Period_Status_End) date_end
from(
	select id_klient, status, @Period_Status_Begin as date_beg
		from #t t1
		where t1.date in (select max(t2.Date)
									from #t as t2
									where t1.id_klient=t2.id_klient and t2.Date<=@Period_Status_Begin)
	union all
	select id_klient, status, date as date_beg
		from #t t1
		where t1.date > @Period_Status_Begin and t1.date <= @Period_Status_End
) t2


На этом можно успакоится или кто-нить подскажет более оптимальный вариант?
23 окт 13, 17:16    [15022253]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить