Как сгруппировать записи по часам с учетом даты начала и окончания - PullRequest
1 голос
/ 29 сентября 2019

Я пытаюсь сгруппировать записи по часам с учетом продолжительности.Предположим, что есть долго запущенные процессы и есть данные журнала, когда процесс был запущен и завершен.Я пытаюсь получить отчет по часам, сколько процессов запущено

Данные выглядят так

Process_name      Start                End

'A'              '2019/01/01 14:10'   '2019/01/01/ 14:55'
'B'              '2019/01/01 14:20'   '2019/01/01/ 16:30'
'C'              '2019/01/01 15:05'   '2019/01/01/ 15:10'

Результат должен выглядеть примерно так

Hour    ProcessQount
14      2
15      2
16      1

Ответы [ 2 ]

0 голосов
/ 29 сентября 2019

Вы можете сделать это, если присоединитесь к рекурсивному cte, который возвращает в таблицу все часы дня:

with cte as (
  select 0 as hour
  union all
  select hour + 1 
  from cte 
  where hour < 23 
)
select c.hour Hour, count(*) ProcessQount 
from cte c inner join tablename t
on c.hour between datepart(hh, t.[Start]) and datepart(hh, t.[End])
group by c.hour

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

> Hour | ProcessQount
> ---: | -----------:
>   14 |            2
>   15 |            2
>   16 |            1

Если вы переключитесь на LEFT JOIN и count([Process_name]), тогда вы получите результаты для всех часов дня:

> Hour | ProcessQount
.........................
>   12 |            0
>   13 |            0
>   14 |            2
>   15 |            2
>   16 |            1
>   17 |            0
>   18 |            0
.........................
0 голосов
/ 29 сентября 2019

Создайте часы, а затем используйте неравенства и агрегацию:

select h, count(t.process_name)
from (values (14), (15), (16)) v(h) left join
     t
     on datepart(hour, start <= v.h) and
        datepart(hour, end >= v.h)
group by v.h
order by v.h;

Для получения разумных результатов предполагается, что все данные, которые вы просматриваете, относятся к одному дню, как в данных выборки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...