qq_38629067 2020-06-18 15:55 采纳率: 100%
浏览 169
已采纳

目前想统计出当前CPU峰值的入表时间(history表中的clock字段),目前如果把clock字段带入,groupby时,就会出现多个,不知道如何编写

图片说明
以下是不加入clock字段的sql:

select  
    g.name as 'groupname',
    h.name as 'hostname',
    t.ip as 'ip',
    100-min(hi.value)
    from    
    zabbix_server.hosts_groups as hg 
    join zabbix_server.hstgrp g on g.groupid = hg.groupid
    join zabbix_server.items i on hg.hostid = i.hostid 
    join zabbix_server.history hi on i.itemid = hi.itemid
    join zabbix_server.hosts h on h.hostid = i.hostid
    join zabbix_server.interface t on h.hostid = t.hostid
    where g.groupid in (20)
    and i.key_ = 'system.cpu.util[,idle]'
    and hi.clock >= (select unix_timestamp(cast(sysdate()as date) - interval 1 day))
    and hi.clock <= (select unix_timestamp(cast(sysdate()as date)))
    group by g.name , h.name ,t.ip;
  • 写回答

1条回答 默认 最新

  • 向阳的花儿 2020-06-18 16:50
    关注

    用分组函数就可以实现;
    如下,就是按照groupname,hostname,ip分组,where筛选后,取hi.value最小时候信息;
    如果要取hi.value最大的时候的信息,要将 row_number() OVER (PARTITION BY g.name,h.name,t.ip ORDER BY hi.value) as N
    中order by 倒叙
    row_number() OVER (PARTITION BY g.name,h.name,t.ip ORDER BY hi.value desc ) as N
    代码如下:

    select groupname,hostname,ip,hivalue,[time] from 
    (
    select  
        g.name as 'groupname',
        h.name as 'hostname',
        t.ip as 'ip',
         100-hi.value as hivalue,
         hi.clock as [time],
        row_number() OVER (PARTITION BY g.name,h.name,t.ip  ORDER BY hi.value) as N
        from    
        zabbix_server.hosts_groups as hg 
        join zabbix_server.hstgrp g on g.groupid = hg.groupid
        join zabbix_server.items i on hg.hostid = i.hostid 
        join zabbix_server.history hi on i.itemid = hi.itemid
        join zabbix_server.hosts h on h.hostid = i.hostid
        join zabbix_server.interface t on h.hostid = t.hostid
        where g.groupid in (20)
        and i.key_ = 'system.cpu.util[,idle]'
        and hi.clock >= (select unix_timestamp(cast(sysdate()as date) - interval 1 day))
        and hi.clock <= (select unix_timestamp(cast(sysdate()as date)))
        group by g.name , h.name ,t.ip
        ) as a
        where a.n=1
    
        补充:Mysql实现
        SET @row_number:=0,@groupname:=null,@hostname:=null,@ip:=null; WITH TOTAL AS ( SELECT @row_number:=CASE WHEN @groupname = groupname and @hostname=hostname and @ip=ip THEN @row_number + 1 else 1 END AS num, @groupname:=groupname, @hostname:=hostname, @ip:= ip, B.* FROM ( select g.name as 'groupname', h.name as 'hostname', t.ip as 'ip', 100-min(hi.value) AS HIVALUE, hi.clock from zabbix_server.hosts_groups as hg join zabbix_server.hstgrp g on g.groupid = hg.groupid join zabbix_server.items i on hg.hostid = i.hostid join zabbix_server.history hi on i.itemid = hi.itemid join zabbix_server.hosts h on h.hostid = i.hostid join zabbix_server.interface t on h.hostid = t.hostid where g.groupid in (20) and i.key_ = 'system.cpu.util[,idle]' and hi.clock >= (select unix_timestamp(cast(sysdate()as date) - interval 1 day)) and hi.clock <= (select unix_timestamp(cast(sysdate()as date)))) AS B ORDER BY groupname , hostname ,ip,hi.clock desc ) SELECT * FROM TOTAL WHERE num=1
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 MapReduce结果输出到HBase,一直连接不上MySQL
  • ¥15 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键
  • ¥15 将二维数组,按照假设的规定,如0/1/0 == "4",把对应列位置写成一个字符并打印输出该字符
  • ¥15 NX MCD仿真与博途通讯不了啥情况
  • ¥15 win11家庭中文版安装docker遇到Hyper-V启用失败解决办法整理
  • ¥15 gradio的web端页面格式不对的问题
  • ¥15 求大家看看Nonce如何配置
  • ¥15 Matlab怎么求解含参的二重积分?
  • ¥15 苹果手机突然连不上wifi了?