Mysql 如何通过状态比较时间戳来计算正常运行率

Mysql 如何通过状态比较时间戳来计算正常运行率,mysql,sql,mysql-8.0,Mysql,Sql,Mysql 8.0,我有一个记录http调用的表。我的桌子是这样的: 调用时间戳 httpStatus 端点 2021-04-01 06:00:00 200 https://someserver/someapi/v1/endpoint1 2021-04-01 10:21:11 200 https://someserver/someapi/v1/endpoint1 2021-04-01 10:25:00 500 https://someserver/someapi/v1/endpoint1 2021-04-01 11

我有一个记录http调用的表。我的桌子是这样的:

调用时间戳 httpStatus 端点 2021-04-01 06:00:00 200 https://someserver/someapi/v1/endpoint1 2021-04-01 10:21:11 200 https://someserver/someapi/v1/endpoint1 2021-04-01 10:25:00 500 https://someserver/someapi/v1/endpoint1 2021-04-01 11:33:15 200 https://someserver/someapi/v1/endpoint1 2021-04-01 11:34:31 200 https://someserver/someapi/v1/endpoint1 2021-04-01 11:35:22 500 https://someserver/someapi/v1/endpoint1 2021-04-01 12:22:54 200 https://someserver/someapi/v1/endpoint1 2021-04-01 10:21:11 200 https://someserver/someapi/v1/endpoint2 2021-04-01 10:25:32 500 https://someserver/someapi/v1/endpoint2 2021-04-01 10:59:12 200 https://someserver/someapi/v1/endpoint2 您可以使用
lead()over()
计算下一个
callTimestamp
min()over()
窗口函数选择最小
callTimestamp
。然后,通过分组和聚合,您可以获得所需的内容

架构和插入语句:

 create table mytable(callTimestamp datetime,   httpStatus int, endpoint varchar(100));
 insert into mytable values('2021-04-01 10:21:11',200,  'https://someserver/someapi/v1/endpoint1');
 insert into mytable values('2021-04-01 10:25:00',500,  'https://someserver/someapi/v1/endpoint1');
 insert into mytable values('2021-04-01 11:33:15',200,  'https://someserver/someapi/v1/endpoint1');
 insert into mytable values('2021-04-01 11:34:31',200,  'https://someserver/someapi/v1/endpoint1');
 insert into mytable values('2021-04-01 11:35:22',500,  'https://someserver/someapi/v1/endpoint1');
 insert into mytable values('2021-04-01 12:22:54',200,  'https://someserver/someapi/v1/endpoint1');
 insert into mytable values('2021-04-01 10:21:11',200,  'https://someserver/someapi/v1/endpoint2');
 insert into mytable values('2021-04-01 10:25:32',500,  'https://someserver/someapi/v1/endpoint2');
 insert into mytable values('2021-04-01 10:59:12',200,  'https://someserver/someapi/v1/endpoint2');
查询:

 select endpoint, 100*(TIME_TO_SEC(TIMEDIFF(NOW(), max(mincalltime)))-sum(TIME_TO_SEC(TIMEDIFF(nexttime, calltimestamp))))/ TIME_TO_SEC(TIMEDIFF(NOW(), max(mincalltime))) uptimeRate
 
 
 from
 (select *,lead(calltimestamp)over (partition by endpoint order by calltimestamp)nexttime,
 min(calltimestamp)over(partition by endpoint order by calltimestamp) mincalltime
 from mytable 
 )t
 where httpstatus=500
 group by endpoint
输出:

端点 升华 https://someserver/someapi/v1/endpoint1 98.8895 https://someserver/someapi/v1/endpoint2 99.6771