mysql计算前一行时间戳差异并按多个对象分组

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 |

我正在尝试为Icinga2数据库生成报告

我想查看每个主机每个服务每天的状态时间

我有以下数据结构:

栏目:

状态\时间>监视对象的状态从A更改为B的时间

状态>对象现在的状态(A,B…)

Last_State>对象在当前时间之前的状态

主机名>主机对象的名称

Servicename>服务对象的名称

我希望报告看起来像:

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中有一个子查询,其中包含这些子查询,然后将子查询连接到我的表中?谢谢你的支持!这里有更多信息: