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

Откуда:
Сообщений: 21
Подскажите пожалуйста, как решаются подобные задачи?
Есть таблица t1
date count
1.07 1
2.07 2
3.07 NULL
4.07 5
5.07 6
6.07 9


Нужно получить t2
date1 date2
1.07 2.07
4.07 6.07


Т.е необходимо разбить на периоды, разгранечителем периодов будет являться NULL в столбце count
Честно сказать первый раз с подобным столкнулся, ума не приложу как подступиться. Я так понимаю тут нужен рекурсивный запрос?
30 окт 16, 12:08    [19838507]     Ответить | Цитировать Сообщить модератору
 Re: SQL рекурсивный запрос?  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
declare @tbl table(t_date date,cnt int)

insert @tbl
values('20160701',1),
('20160702',2),
('20160703',NULL),
('20160704',5),
('20160705',6),
('20160706',9)


select min(t_date) as date1,max(t_date) as date2
from(
select *,sum(num) over(order by t_date) g
from(
select*, case when cnt is null then 1 else 0 end num
from @tbl
) a
) b
where cnt is not null
group by g
30 окт 16, 13:33    [19838750]     Ответить | Цитировать Сообщить модератору
 Re: SQL рекурсивный запрос?  [new]
_human
Member

Откуда:
Сообщений: 569
claims,
не проверял
;with cte as 
(
	select 
		date
		, count
		, case when count is null then 1 else 0 end as x
		, row_number() over(order by date) as rn
	from t1
)
select min(date), max(date)
from
(
	select 
		*
		, sum(x) over(order by rn) as grp
	from cte
) q
where q.x = 0
group by grp
30 окт 16, 13:46    [19838780]     Ответить | Цитировать Сообщить модератору
 Re: SQL рекурсивный запрос?  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
declare @tbl table(t_date date,cnt int)

insert @tbl
values('20160701',1),
('20160702',2),
('20160703',NULL),
('20160704',5),
('20160705',6),
('20160706',9)


select min(t_date) date1,max(t_date) date2
from(
select *
,row_number() over(order by case when cnt is null then 1 else 0 end  ) - row_number() over(order by t_date) as g
from @tbl
) a
where cnt is not null
group by g
order by date1
30 окт 16, 13:54    [19838800]     Ответить | Цитировать Сообщить модератору
 Re: SQL рекурсивный запрос?  [new]
claims
Member

Откуда:
Сообщений: 21
3unknown
Спасибо большое! Обалденный способ!

По логике также думал изначально, но у меня не получалось группы цифрами пронумеровать должным образом!
30 окт 16, 15:56    [19838998]     Ответить | Цитировать Сообщить модератору
 Re: SQL рекурсивный запрос?  [new]
ДинВинчеста
Guest
declare @tbl table(date date,cnt int)

insert @tbl
values('20160701',1),
('20160702',2),
('20160703',NULL),
('20160704',5),
('20160705',6),
('20160706',9),
('20160709',NULL),
('20160710', 10),
('20160711', 11)

;with cte as (select 
date, cnt,
sum(case when cnt is not null then 0 else 1 end) over
(order by date) rwn
from @tbl)
select 
min(date), max(date)
from cte where cnt is not null
group by rwn
30 окт 16, 16:12    [19839018]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить