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

Откуда:
Сообщений: 1066
;with rawData([timestamp],v) as 
(
select 
 '2018-08-22 01:33:40.0000000',1
 union all
 select
'2018-08-22 01:45:40.0000000',0 -- эта запись должна войти в выборку
union all
 select
'2018-08-22 15:02:56.0000000',0 -- эта нет
union all
 select
'2018-08-22 15:03:01.0000000',0 -- и эта нет
union all
 select
'2018-08-22 16:09:38.0000000',1
union all
 select
'2018-08-22 16:13:40.0000000',0
union all
 select
'2018-08-22 18:31:40.0000000',1
union all
 select
'2018-08-22 19:07:38.0000000',0

)


совсем мыслей пока нет, как получить результат

2018-08-22 01:33:40.0000000 1
2018-08-22 01:45:40.0000000 0
2018-08-22 16:09:38.0000000 1
2018-08-22 16:13:40.0000000 0
2018-08-22 18:31:40.0000000 1
2018-08-22 19:07:38.0000000 0


выборка изначально формируется во времени. меняется только 0 и 1 (а могут и не меняться, но timestamp всегда уникальный, и возрастает
16 сен 18, 18:59    [21676066]     Ответить | Цитировать Сообщить модератору
 Re: первая запись в окне для значения  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
waszkiewicz
;with rawData([timestamp],v) as 
(
select 
 '2018-08-22 01:33:40.0000000',1
 union all
select 
 '2018-08-22 01:34:40.0000000',1 -- а эта запись должна войти в выборку ?
 union all
select 
 '2018-08-22 01:35:40.0000000',1 -- а эта запись должна войти в выборку ?
 union all
select 
 '2018-08-22 01:36:40.0000000',1 -- а эта запись должна войти в выборку ?
 union all
 select
'2018-08-22 01:45:40.0000000',0 -- эта запись должна войти в выборку
union all
 select
'2018-08-22 15:02:56.0000000',0 -- эта нет
union all
 select
'2018-08-22 15:03:01.0000000',0 -- и эта нет
union all
 select
'2018-08-22 16:09:38.0000000',1
union all
select 
'2018-08-22 16:09:39.0000000',1 -- а эта запись должна войти в выборку ?
union all
select 
'2018-08-22 16:09:39.5000000',1 -- а эта запись должна войти в выборку ?
union all
 select
'2018-08-22 16:13:40.0000000',0
union all
select 
'2018-08-22 16:13:41.0000000',0 -- а эта запись должна войти в выборку ?
union all
select 
'2018-08-22 16:13:42.0000000',0 -- а эта запись должна войти в выборку ?
union all
 select
'2018-08-22 18:31:40.0000000',1
union all
 select
'2018-08-22 19:07:38.0000000',0

)


совсем мыслей пока нет, как получить результат

2018-08-22 01:33:40.0000000 1
2018-08-22 01:45:40.0000000 0
2018-08-22 16:09:38.0000000 1
2018-08-22 16:13:40.0000000 0
2018-08-22 18:31:40.0000000 1
2018-08-22 19:07:38.0000000 0


выборка изначально формируется во времени. меняется только 0 и 1 (а могут и не меняться, но timestamp всегда уникальный, и возрастает
17 сен 18, 04:17    [21676276]     Ответить | Цитировать Сообщить модератору
 Re: первая запись в окне для значения  [new]
Щукина Анна
Member

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

но в целом, вам нужно смотреть в сторону LEAD/LAG, если версия сервера позволяет (2012 и выше)

если не позволяет, то TOP-1 [CROSS | OUTER] APPLY - подзапрос (версии 2005 / 2008)

если сервер и того древнее, то скалярный коррелированный TOP-1 подзапрос в списке SELECT
17 сен 18, 04:20    [21676278]     Ответить | Цитировать Сообщить модератору
 Re: первая запись в окне для значения  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1066
Щукина Анна,
нет, отмеченные желтым не должны. из повторяющихся нужны только самые ранние значения по времени в группе.
select @@version

Microsoft SQL Server 2012 - 11.0.2100.60 (X64)
Feb 10 2012 19:39:15
Copyright (c) Microsoft Corporation
Express Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

lead/lag - по могу догнать, как поймать изменение значения и выкинуть дубликаты
в принципе курсором можно пробежать и добавить во времянку только нужное, но как-то не очень...
17 сен 18, 08:52    [21676344]     Ответить | Цитировать Сообщить модератору
 Re: первая запись в окне для значения  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
waszkiewicz
lead/lag - по могу догнать, как поймать изменение значения и выкинуть дубликаты
в принципе курсором можно пробежать и добавить во времянку только нужное, но как-то не очень...


+ Пример реализации
;with rawData([timestamp],v) as 
(
select 
 '2018-08-22 01:33:40.0000000',1
 union all
select 
 '2018-08-22 01:34:40.0000000',1 -- а эта запись должна войти в выборку ?
 union all
select 
 '2018-08-22 01:35:40.0000000',1 -- а эта запись должна войти в выборку ?
 union all
select 
 '2018-08-22 01:36:40.0000000',1 -- а эта запись должна войти в выборку ?
 union all
 select
'2018-08-22 01:45:40.0000000',0 -- эта запись должна войти в выборку
union all
 select
'2018-08-22 15:02:56.0000000',0 -- эта нет
union all
 select
'2018-08-22 15:03:01.0000000',0 -- и эта нет
union all
 select
'2018-08-22 16:09:38.0000000',1
union all
select 
'2018-08-22 16:09:39.0000000',1 -- а эта запись должна войти в выборку ?
union all
select 
'2018-08-22 16:09:39.5000000',1 -- а эта запись должна войти в выборку ?
union all
 select
'2018-08-22 16:13:40.0000000',0
union all
select 
'2018-08-22 16:13:41.0000000',0 -- а эта запись должна войти в выборку ?
union all
select 
'2018-08-22 16:13:42.0000000',0 -- а эта запись должна войти в выборку ?
union all
 select
'2018-08-22 18:31:40.0000000',1
union all
 select
'2018-08-22 19:07:38.0000000',0

)
select * from (
select * , case lag(v) over(order by [timestamp]) when v then 0 else 1 end as flag
from rawData
) v


Наложить во внешнем запросе условие "where flag = 1" сами сможете?
17 сен 18, 09:10    [21676360]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить