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

Откуда:
Сообщений: 181
Здравствуйте, всю голову уже сломал, помогите с запросом.
Требуется выбрать первые значения по дате с минимальной даты до первого NULL в другом столбце

declare @t table([day] datetime null, [is_editing] int)

insert into @t([day],[is_editing])
select cast('03.11.2017 00:00:00.000' AS DATETIME) as [day],1 [is_editing] union all
select cast('04.11.2017 00:00:00.000' AS DATETIME) as [day],2 [is_editing] union all
select cast('05.11.2017 00:00:00.000' AS DATETIME) as [day],3 [is_editing] union all
select cast('06.11.2017 00:00:00.000' AS DATETIME) as [day],4 [is_editing] union all
select cast('07.11.2017 00:00:00.000' AS DATETIME) as [day],5 [is_editing] union all
select cast('08.11.2017 00:00:00.000' AS DATETIME) as [day],6 [is_editing] union all
select cast('09.11.2017 00:00:00.000' AS DATETIME) as [day],NULL [is_editing] union all
select cast('10.11.2017 00:00:00.000' AS DATETIME) as [day],NULL [is_editing] union all
select cast('11.11.2017 00:00:00.000' AS DATETIME) as [day],9 [is_editing] union all
select cast('12.11.2017 00:00:00.000' AS DATETIME) as [day],10 [is_editing] union all
select cast('13.11.2017 00:00:00.000' AS DATETIME) as [day],11 [is_editing] union all
select cast('14.11.2017 00:00:00.000' AS DATETIME) as [day],12 [is_editing] union all
select cast('15.11.2017 00:00:00.000' AS DATETIME) as [day],NULL [is_editing] union all
select cast('16.11.2017 00:00:00.000' AS DATETIME) as [day],NULL [is_editing] union all
select cast('17.11.2017 00:00:00.000' AS DATETIME) as [day],NULL [is_editing] union all
select cast('18.11.2017 00:00:00.000' AS DATETIME) as [day],16 [is_editing] union all
select cast('19.11.2017 00:00:00.000' AS DATETIME) as [day],17 [is_editing] union all
select cast('20.11.2017 00:00:00.000' AS DATETIME) as [day],18 [is_editing] union all
select cast('21.11.2017 00:00:00.000' AS DATETIME) as [day],19 [is_editing] union all
select cast('22.11.2017 00:00:00.000' AS DATETIME) as [day],NULL [is_editing] union all
select cast('23.11.2017 00:00:00.000' AS DATETIME) as [day],NULL [is_editing] union all
select cast('24.11.2017 00:00:00.000' AS DATETIME) as [day],NULL [is_editing] union all
select cast('25.11.2017 00:00:00.000' AS DATETIME) as [day],23 [is_editing] union all
select cast('26.11.2017 00:00:00.000' AS DATETIME) as [day],24 [is_editing] union all
select cast('27.11.2017 00:00:00.000' AS DATETIME) as [day],25 [is_editing] union all
select cast('28.11.2017 00:00:00.000' AS DATETIME) as [day],26 [is_editing] union all
select cast('29.11.2017 00:00:00.000' AS DATETIME) as [day],NULL [is_editing] union all
select cast('30.11.2017 00:00:00.000' AS DATETIME) as [day],NULL [is_editing] union all
select cast('01.12.2017 00:00:00.000' AS DATETIME) as [day],NULL [is_editing] union all
select cast('02.12.2017 00:00:00.000' AS DATETIME) as [day],30 [is_editing] union all
select cast('03.12.2017 00:00:00.000' AS DATETIME) as [day],31 [is_editing] union all
select cast('04.12.2017 00:00:00.000' AS DATETIME) as [day],32 [is_editing] union all
select cast('05.12.2017 00:00:00.000' AS DATETIME) as [day],33 [is_editing] union all
select cast('06.12.2017 00:00:00.000' AS DATETIME) as [day],NULL [is_editing] union all
select cast('07.12.2017 00:00:00.000' AS DATETIME) as [day],NULL [is_editing] 


select [day],[is_editing] from @t
order by [day]


На выходе должно получиться
day	is_editing
2017-11-03 00:00:00.000	1
2017-11-04 00:00:00.000	2
2017-11-05 00:00:00.000	3
2017-11-06 00:00:00.000	4
2017-11-07 00:00:00.000	5
2017-11-08 00:00:00.000	6
19 окт 17, 11:36    [20881732]     Ответить | Цитировать Сообщить модератору
 Re: Ограничить период до ближайшего NULL  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20538
Ну типа
WITH @t,
(SELECT MIN([day]) [day]
 FROM @t
 WHERE is_editing IS NULL) AS @tt
SELECT *
FROM @t
JOIN @tt ON @t.[day]<@tt.[day]
19 окт 17, 11:41    [20881758]     Ответить | Цитировать Сообщить модератору
 Re: Ограничить период до ближайшего NULL  [new]
serega063
Member

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

намек понятен, буду в эту сторону качать
19 окт 17, 11:47    [20881788]     Ответить | Цитировать Сообщить модератору
 Re: Ограничить период до ближайшего NULL  [new]
iap
Member

Откуда: Москва
Сообщений: 46983
SELECT *
FROM @t T
WHERE NOT EXISTS
(
 SELECT *
 FROM @t TT
 WHERE TT.[day]<=T.[day] AND TT.is_editing IS NULL
);
Кто вас учил так даты писать?
19 окт 17, 12:07    [20881897]     Ответить | Цитировать Сообщить модератору
 Re: Ограничить период до ближайшего NULL  [new]
dies irae
Member

Откуда:
Сообщений: 78
select *
from (select *, max(iif(is_editing is null,1,0)) over (order by day) as m
	from @t
	) as t
where m=0
19 окт 17, 16:31    [20883207]     Ответить | Цитировать Сообщить модератору
 Re: Ограничить период до ближайшего NULL  [new]
serega063
Member

Откуда:
Сообщений: 181
dies irae,

А вот это элегантнее ))))
спасибо
20 окт 17, 08:26    [20884481]     Ответить | Цитировать Сообщить модератору
 Re: Ограничить период до ближайшего NULL  [new]
Кусочек
Guest
serega063
dies irae,

А вот это элегантнее ))))
спасибо


Я бы на Вашем месте не элегантностью восхищалась, а запустила оба запроса на тестовом массиве данных и сравнила время выполнения.
20 окт 17, 09:03    [20884541]     Ответить | Цитировать Сообщить модератору
 Re: Ограничить период до ближайшего NULL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7780
Кусочек,

+1 сортировки никогда не были элегантным решением.
20 окт 17, 12:24    [20885418]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить