mysql计算前一行时间戳差异并按多个对象分组
我正在尝试为Icinga2数据库生成报告 我想查看每个主机每个服务每天的状态时间 我有以下数据结构: 栏目: 状态\时间>监视对象的状态从A更改为B的时间 状态>对象现在的状态(A,B…) Last_State>对象在当前时间之前的状态 主机名>主机对象的名称 Servicename>服务对象的名称 我希望报告看起来像:mysql计算前一行时间戳差异并按多个对象分组,mysql,group-by,row,summary,icinga2,Mysql,Group By,Row,Summary,Icinga2,我正在尝试为Icinga2数据库生成报告 我想查看每个主机每个服务每天的状态时间 我有以下数据结构: 栏目: 状态\时间>监视对象的状态从A更改为B的时间 状态>对象现在的状态(A,B…) Last_State>对象在当前时间之前的状态 主机名>主机对象的名称 Servicename>服务对象的名称 我希望报告看起来像: host | service | day | State A % | State B % a.b.c | srvxyz |1.1.1| 70 |
host | service | day | State A % | State B %
a.b.c | srvxyz |1.1.1| 70 | 30
所以我基本上可以看到可用性的百分比
根据我的想法,我需要:
- 按主机名分组、按服务名分组、按日期时间字段的日期分组
- 计算并汇总每个事件到依赖于状态的前一个事件的时间
select
sum(state_time_usec),
max(name1),
max(name2),
max(date(state_time)),
max(state)
from
icinga_statehistory
inner join icinga_objects on icinga_objects.object_id = icinga_statehistory.object_id
group by icinga_objects.object_id,date(state_time),state
order by state_time desc
但是我不知道如何从上一行的计算开始。你能给我指个方向吗?你有什么想法吗?
谢谢大家! 您可以为表格创建排名,如:
@curRank:=@curRank+1排名
和内部连接到具有
@curRank:=@curRank+2排名
因此,您将获得上一个值。有了这张表格,您就可以计算出您需要什么。嗨,ecp,谢谢您的好主意。我必须承认,我从来没有在我的查询中使用过秩,也没有使用过局部变量。所以我不太确定把这个放在查询中的什么地方?我认为第一个是在select语句中,但是联接是如何工作的呢?或者我需要在select statemenet中有一个子查询,其中包含这些子查询,然后将子查询连接到我的表中?谢谢你的支持!这里有更多信息: