【问题标题】:SUM(LAST()) on GROUP BYGROUP BY 上的 SUM(LAST())
【发布时间】:2016-10-07 15:41:15
【问题描述】:

我有一个系列,disk,,其中包含一个磁盘的path/mnt/disk1/mnt/disk2 等)和total 空间。它还包括 freeused 值。这些值以指定的时间间隔更新。我想做的是查询以获取每条路径的last()total 的总和。我还想对freeused 执行相同的操作,以获取服务器上所有磁盘的总大小、可用空间和已用空间。

我在这里有一个查询,它将得到所有磁盘的last(total),按其路径分组(用于区分):

select last(total) as total from disk where path =~ /(mnt\/disk).*/ group by path

目前,这将返回 5 个系列,每个系列包含 1 行(最新)及其total 的值。然后我想取这些系列的总和,但我不能只将last(total) 包装到sum() 函数调用中。有没有办法做到这一点,我错过了?

【问题讨论】:

  • 在这里,他们讨论了 InfluxDB 中尚未普遍支持的嵌套函数。 github.com/influxdata/influxdb/issues/6823 。建议的解决方法是为一个值(例如总计)构建 CQ,并使用另一个函数(例如 last() )查询 CQ。

标签: influxdb


【解决方案1】:

继续我上面关于嵌套函数的评论。

构建一个玩具示例:

CREATE DATABASE FOO
USE FOO

假设您的数据更新间隔大于[1]每分钟:

CREATE CONTINUOUS QUERY disk_sum_total ON FOO 
BEGIN
  SELECT sum("total") AS "total_1m" INTO disk_1m_total FROM "disk" 
  GROUP BY time(1m)
END

然后压入一些值:

INSERT disk,path="/mnt/disk1" total=30
INSERT disk,path="/mnt/disk2" total=32
INSERT disk,path="/mnt/disk3" total=33

再等一分钟。那么:

INSERT disk,path="/mnt/disk1" total=41
INSERT disk,path="/mnt/disk2" total=42
INSERT disk,path="/mnt/disk3" total=43

再等一分钟+。那么:

SELECT * FROM disk_1m_total

name: disk_1m_total
-------------------
time                    total_1m
1476015300000000000     95
1476015420000000000     126

这两个值是30+32+33=9541+42+43=126

从那里,查询很简单:

SELECT last(total_1m) FROM disk_1m_total

name: disk_1m_total
-------------------
time                    last
1476015420000000000     126

希望对您有所帮助。

[1] 选择小于更新频率的间隔可防止较小的时序抖动使给定组的所有数据意外相加两次。可能有一些“零更新”间隔,但没有“重复计数”间隔。我通常以两倍于更新的速度运行查询。如果 CQ 没有看到某个窗口的数据,则不会对该窗口执行 CQ,因此last() 仍会给出正确答案。例如,我让 CQ 整夜运行并且没有推送新数据:last(total_1m) 给出了相同的答案,“没有新数据”不是零。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多