如何根据开始日期和结束日期按小时对记录进行分组
How to group records by hours considering start date and end date
我试图在考虑持续时间的情况下按小时对记录进行分组。假设有很长的 运行 个进程,并且在进程启动和完成时有日志数据。我正在尝试按小时获取报告有多少进程 运行
数据是这样的
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
生成小时数,然后使用不等式和聚合:
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;
为了获得合理的结果,这假设您正在查看的所有数据都是一天的数据,就像您的样本数据中一样。
如果你加入一个递归 cte 就可以做到这一点,returns 一天中的所有时间到 table:
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
.........................
我试图在考虑持续时间的情况下按小时对记录进行分组。假设有很长的 运行 个进程,并且在进程启动和完成时有日志数据。我正在尝试按小时获取报告有多少进程 运行
数据是这样的
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
生成小时数,然后使用不等式和聚合:
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;
为了获得合理的结果,这假设您正在查看的所有数据都是一天的数据,就像您的样本数据中一样。
如果你加入一个递归 cte 就可以做到这一点,returns 一天中的所有时间到 table:
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
.........................