我正在尝试根据时长对记录进行分组。假设有长时间运行的进程,并且在进程启动和完成时有日志数据。我试图按小时数获取正在运行的进程数的报告
数据看起来像这样
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
答案 0 :(得分:0)
生成小时数,然后使用不等式和聚合:
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;
为了获得合理的结果,它假定您正在查看的所有数据都是一天,就像您的示例数据一样。
答案 1 :(得分:0)
如果您加入了将一天中所有时间返回到表中的递归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
请参见demo。
结果:
> 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
.........................