查询某个时间点的最后数据总和

时间:2018-01-18 10:47:29

标签: time-series influxdb

我希望我能够很好地解释这个和我的用例。我有一堆由algo列拆分的数据,每个字段都有不同的值,我的目标是得到每5分钟报告一次的值。

这可以通过以下方式实现:

> use testdb
Using database testdb
> SELECT sum("value") FROM "balance" group by time(5m) order by time desc limit 20
name: balance
-------------
time                    sum
1516268400000000000
1516268100000000000
1516267800000000000
1516267500000000000
1516267200000000000
1516266900000000000
1516266600000000000
1516266300000000000     0.00675834
1516266000000000000     0.00675797
1516265700000000000     0.00675691

这提出了两个问题。

  1. 如您所见,1516266600000000000之后我没有参赛作品。对我来说这是预期的行为,每个后续的总和应该是它能找到的最接近的条目。这里的所有空白都应该是0.00675834
  2. 如果任何algo缺少数据点,则总和将不包含该数据。
  3. 可视化我想要实现的目标:

    Time  | Algo a | Algo b | Algo c
    ------|--------|--------|---------
    5     | 10     |        | 34
    4     | 10     | 23     | 31
    3     | 9      | 23     |
    2     |        |        | 20
    1     | 4      | 23     | 20
    

    如果我想在时间5之间选择,那么它将是10,23的总和(因为它是最接近的前一个条目)和34. 67

    如果我想在时间3选择,那么它将是9,23和20. 52

    摘要

    问题的第一部分:我如何获得这样的价值?

    问题的第二部分:我如何扩展它以找到我的两个例子的delta来输出15?

    示例数据集

    > select * from "balance"
    name: balance
    -------------
    time                    algo            value           mode
    1514205000000000000     AlgoA           0.00000778      debug
    1514205000000000000     AlgoB           0.00004702      debug
    1514205000000000000     AlgoC           0.00002564      debug
    1514205000000000000     AlgoD           0.00000335      debug
    1514205000000000000     AlgoE           0.00014048      debug
    1514205000000000000     AlgoG           0.00050431      debug
    1514205000000000000     AlgoH           0.00000164      debug
    1514205300000000000     AlgoA           0.00000778      debug
    1514205300000000000     AlgoB           0.00004702      debug
    1514205300000000000     AlgoC           0.00002564      debug
    1514205300000000000     AlgoD           0.00000335      debug
    1514205300000000000     AlgoF           0.00002664      debug
    1514205300000000000     AlgoG           0.00050431      debug
    1514205300000000000     AlgoH           0.00000164      debug
    1514205600000000000     AlgoA           0.00000778      debug
    1514205600000000000     AlgoB           0.00004702      debug
    1514205600000000000     AlgoC           0.00002564      debug
    1514205600000000000     AlgoD           0.00000335      debug
    1514205600000000000     AlgoE           0.00014048      debug
    1514205600000000000     AlgoF           0.00002664      debug
    1514205600000000000     AlgoG           0.00050431      debug
    1514205900000000000     AlgoA           0.00000778      debug
    1514205900000000000     AlgoB           0.00004702      debug
    1514205900000000000     AlgoC           0.00002564      debug
    1514205900000000000     AlgoD           0.00000335      debug
    1514205900000000000     AlgoE           0.00014048      debug
    1514205900000000000     AlgoF           0.00002664      debug
    

1 个答案:

答案 0 :(得分:0)

好的,让我想出它似乎是什么,你确认或纠正这些假设。

看起来像:

  1. 你有一个5分钟的时间序列。

  2. 其中的值除以algo s

  3. 预计每个系列每algo有0到1分

  4. 您需要的是 - 此5分钟系列中所有algo的总和。

  5. 虽然,如果特定algo的系列中没有任何意义 - 它应该替换上一系列中的最后一个可用值。

  6. 这是对的吗?

    UPDATE 事实证明这是正确的。

    然后尝试以下方法。

    首先,由于您希望每个系列不超过一个具有特定算法标记的值,因此您可以在按时间分组时安全地应用LAST()。这里的技巧是使用fill()选项进行时间分组,如:

    SELECT LAST("value"), algo FROM "balance" WHERE time > now() - 6h GROUP BY time(5m) fill(previous)
    

    如果系列中没有,那么显然会给你想要的前一个点值。

    下一步,总结此查询的结果:

    SELECT SUM(lv) FROM (SELECT LAST("value") as lv FROM "balance" WHERE time > now() - 6h GROUP BY time(5m) fill(previous)) WHERE time > now() - 6h GROUP BY time(5m)
    

    这会让你回答第一个问题。 我希望。 : - )