powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с запросом
9 сообщений из 9, страница 1 из 1
Помогите с запросом
    #39742510
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Пусть есть данные:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
set dateformat dmy
declare @t table (date datetime, Num int)

insert into @t values 
('01-02-2016',1),
('02-02-2016',1),
('03-02-2016',0), 
('04-02-2016',1),
('08-02-2016',1);



Необходимо в порядке возрастания дат и при изменении признака Num получить следующие интервалы:
Код: plaintext
1.
2.
3.
01-02-2016 03-02-2016 1
03-02-2016 04-02-2016 0
04-02-2016 08-02-2016 1

Как такое можно сделать?

Спасибо.
...
Рейтинг: 0 / 0
Помогите с запросом
    #39742529
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если упростить задачу:

Код: plaintext
1.
2.
01-02-2016 02-02-2016 1
03-02-2016 03-02-2016 0
04-02-2016 08-02-2016 1

?
...
Рейтинг: 0 / 0
Помогите с запросом
    #39742530
waszkiewicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__,

если версия сервера позволяет - lead
...
Рейтинг: 0 / 0
Помогите с запросом
    #39742532
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select
 min(t.date), isnull(a.date, b.date), t.num
from
 @t t outer apply
 (select top (1) date from @t where Num <> t.Num and date > t.date order by date) a cross apply
 (select top (1) date from @t order by date desc) b
group by
 t.num, isnull(a.date, b.date)
order by
 min(t.date);
...
Рейтинг: 0 / 0
Помогите с запросом
    #39742544
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
;with cte as (
	select 
		* 
		,rn	=row_number()over(order by date)
		,lag	=lag(Num)over(order by date)
		,lead	=lead(Num)over(order by date)
	from @t
),
cte1 as (
	select
		*
		,flag	=case when lag <> Num or lag is null or lead is null then rn end 
	from cte )

select 
	sDate	=t1.date
	,fDate	=a.date
	,t1.Num
from cte1 t1

cross apply (select top 1 t2.date from cte1 t2 where t2.flag>t1.flag order by t2.flag) a

where t1.flag is not null
order by t1.date
...
Рейтинг: 0 / 0
Помогите с запросом
    #39742547
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
второе цте, как бы и не надо ... )
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
;with cte as (
	select 
		* 
		,flag	=case when lag(Num)over(order by date) <> Num or lag(Num)over(order by date) is null or lead(Num)over(order by date) is null then row_number()over(order by date) end 
	from @t
)

select 
	sDate	=t1.date
	,fDate	=a.date
	,t1.Num

from cte t1

cross apply (select top 1 t2.date from cte t2 where t2.flag>t1.flag order by t2.flag) a

where t1.flag is not null
order by t1.date
...
Рейтинг: 0 / 0
Помогите с запросом
    #39742640
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
courtвторое цте, как бы и не надо ... )

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
;with cte as (
	select 
		* 
		,flag	=case when lag(Num)over(order by date) <> Num or lag(Num)over(order by date) is null or lead(Num)over(order by date) is null then row_number()over(order by date) end 
	from @t
)

select 
	sDate	=t1.date
	,fDate	=a.date
	,t1.Num

from cte t1

cross apply (select top 1 t2.date from cte t2 where t2.flag>t1.flag order by t2.flag) a

where t1.flag is not null
order by t1.date

да тут много чего, помимо СТЕ, можно выкинуть. ;)

Как вариант:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
set dateformat dmy
declare @t table (date datetime, Num int)

insert into @t values 
('01-02-2016',1),
('02-02-2016',1),
('03-02-2016',0), 
('04-02-2016',1),
('08-02-2016',1);

--
--
select min(date) as date_start
     , max(date) as date_end
     , lead(min(date),1,max(date)) over(order by min(date))
     , num
  from (
         select * 
              , row_number() over(partition by num order by date)
              - row_number() over(order by date) as grp_id
           from @t
       ) v
 group by num, grp_id
 order by min(date)
...
Рейтинг: 0 / 0
Помогите с запросом
    #39742641
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Аннаcourtвторое цте, как бы и не надо ... )

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
;with cte as (
	select 
		* 
		,flag	=case when lag(Num)over(order by date) <> Num or lag(Num)over(order by date) is null or lead(Num)over(order by date) is null then row_number()over(order by date) end 
	from @t
)

select 
	sDate	=t1.date
	,fDate	=a.date
	,t1.Num

from cte t1

cross apply (select top 1 t2.date from cte t2 where t2.flag>t1.flag order by t2.flag) a

where t1.flag is not null
order by t1.date

да тут много чего, помимо СТЕ, можно выкинуть. ;)

Как вариант:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
set dateformat dmy
declare @t table (date datetime, Num int)

insert into @t values 
('01-02-2016',1),
('02-02-2016',1),
('03-02-2016',0), 
('04-02-2016',1),
('08-02-2016',1);

--
--
select min(date) as date_start
     , max(date) as date_end -- "А если упростить задачу:"(с)
     , lead(min(date),1,max(date)) over(order by min(date)) as date_end_1 -- Исходная постановка задачи
     , num
  from (
         select * 
              , row_number() over(partition by num order by date)
              - row_number() over(order by date) as grp_id
           from @t
       ) v
 group by num, grp_id
 order by min(date)


:)
...
Рейтинг: 0 / 0
Помогите с запросом
    #39743942
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с запросом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]