Найти "нулевые" вхождения Диапазоны, сгруппированные по идентификатору - PullRequest
0 голосов
/ 05 мая 2020

Представьте, что у меня есть такая Sql серверная таблица:

Timestamp   TrendAggregationId  Value   Quality


2020-02-10 13:55:00.000 1   15     100
2020-02-10 14:00:00.000 1   NULL    0
2020-02-10 14:05:00.000 1   NULL    0
2020-02-10 14:10:00.000 1   NULL    0
2020-02-10 14:15:00.000 1   NULL    0
2020-02-10 14:20:00.000 1   NULL    0
2020-02-10 14:25:00.000 1   NULL    0
2020-02-10 14:30:00.000 1   30      100
2020-02-10 14:35:00.000 1   40      99
2020-02-10 14:40:00.000 1   NULL    0
2020-02-10 14:45:00.000 1   NULL    0
2020-02-10 14:50:00.000 1   NULL    0
2020-02-10 14:55:00.000 1   NULL    0
2020-02-10 15:00:00.000 2   20     100
2020-02-10 15:05:00.000 2   99     100
2020-02-10 15:10:00.000 2   110    100
2020-02-10 15:15:00.000 2   NULL    0
2020-02-10 15:20:00.000 2   NULL    0
2020-02-10 15:25:00.000 2   NULL    0
2020-02-10 15:30:00.000 2   NULL    0
2020-02-10 15:35:00.000 2   NULL    0
2020-02-10 15:40:00.000 2   NULL    0
2020-02-10 15:45:00.000 2   NULL    0
2020-02-10 15:50:00.000 2   NULL    0
2020-02-10 15:55:00.000 2   NULL    0
2020-02-10 16:00:00.000 2   NULL    0
2020-02-10 16:05:00.000 2   NULL    0

Я хотел бы получить весь диапазон времени строки NULL (начало / конец), сгруппированный для любого AggregationID

для этот пример выглядит примерно так:

TrendAggregationId   Start                            End
1                  2020-02-10 14:00:00.000        2020-02-10 14:25:00.000
1                  2020-02-10 14:40:00.000        2020-02-10 14:55:00.000
2                  2020-02-10 15:15:00.000        2020-02-10 16:05:00.000

Есть ли у вас какие-нибудь предложения? большое спасибо!

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

С функцией окна SUM():

select TrendAggregationId, 
  min(Timestamp) [Start], 
  max(Timestamp) [End]
from (
  select *, 
    sum(case when Value is null then 0 else 1 end) over (partition by TrendAggregationId order by Timestamp) grp
  from tablename
) t
where Value is null
group by TrendAggregationId, grp

См. Демонстрацию . Результатов:

> TrendAggregationId | Start                   | End                    
> -----------------: | :---------------------- | :----------------------
>                  1 | 2020-02-10 14:00:00.000 | 2020-02-10 14:25:00.000
>                  1 | 2020-02-10 14:40:00.000 | 2020-02-10 14:55:00.000
>                  2 | 2020-02-10 15:15:00.000 | 2020-02-10 16:05:00.000
0 голосов
/ 05 мая 2020

Подсчитайте количество ненулевых значений до каждой строки. Это определяет группу. Затем объедините (и отфильтруйте):

select TrendAggregationId, min(timestamp), max(timestamp)
from (select t.*,
             count(*) over (partition by TrendAggregationId order by timestamp) as grp
      from t
     ) t
group by TrendAggregationId, grp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...