我有一项服务,可以监视每个主机的用户数量。
我需要一个查询,该查询每5分钟获取每台主机的最大用户数量,然后将它们全部求和,即它返回我在系统中跨主机的用户数量。
我需要将结果绘制为折线图以查看演变情况。
使用以下查询时,每隔5分钟可以看到每个主机中的最大用户数:
SELECT max("users.connected") AS "users"
FROM "telegraf"."autogen"."customer"
WHERE time > now() - 12h
GROUP BY time(5m), "host"
FILL(0)
但是,当我尝试使用以下子查询对这些系列进行分组时,它将返回一系列零,并且当只有一个主机的数据可用时(即其余主机返回零用户),就会返回该主机的指标。
SELECT sum("users")
FROM
(SELECT max("users.connected") AS "users"
FROM "telegraf"."autogen"."customer"
WHERE time > now() - 12h
GROUP BY time(5m), "host"
FILL(0))
GROUP BY time(5m)
是否可以实现这种聚合?我在做什么错了?
答案 0 :(得分:0)
我发现问题出在fill(0)
语句上。
当我将其替换为fill(null)
时,它可以正常工作。
SELECT sum("users")
FROM
(SELECT max("users.connected") AS "users"
FROM "telegraf"."autogen"."customer"
WHERE time > now() - 12h
GROUP BY time(5m), "host"
FILL(null))
GROUP BY time(5m)
此外,当在datetime选择器中选择一个绝对日期时,我们需要按照@Yuri Lachin的建议,将WHERE
子句添加到外部查询中。在这种情况下,它将添加WHERE time > :dashboardTime: AND time < :upperDashboardTime:
,因此整个查询最终变为:
SELECT sum("users")
FROM
(SELECT max("users.connected") AS "users"
FROM "telegraf"."autogen"."customer"
WHERE time > :dashboardTime: AND time < :upperDashboardTime:
GROUP BY time(5m), "host"
FILL(null))
WHERE time > :dashboardTime: AND time < :upperDashboardTime:
GROUP BY time(5m)