【问题标题】:InfluxDB - Getting only last value in queryInfluxDB - 仅获取查询中的最后一个值
【发布时间】:2023-11-22 23:42:01
【问题描述】:

是否可以只查询查询结果的最后一个值(或第 n 个值)?

例如在查询中:

SELECT value FROM response_times WHERE time > now() - 1h limit 1000;

是否可能只获得最后一个值,即更早的时间(可能是第 1000 个元素)?

当然我可以把它们全部检索出来然后跳到最后一个,但我不想这样浪费带宽。

【问题讨论】:

    标签: influxdb


    【解决方案1】:

    如果您使用 InfluxDB 0.8,请不要使用 FIRST()LAST() 如果您没有 GROUP BY,因为它的 很慢 :(

    因此,如果您想获得应该使用的这些值:

    第一个值:

    SELECT * FROM <SERIES> GROUP BY * ORDER BY ASC LIMIT 1
    

    最后一个值:

    SELECT * FROM <SERIES> GROUP BY * ORDER BY DESC LIMIT 1
    

    不要删除 GROUP BY *,因为那样你可能会得到意想不到的值。

    【讨论】:

    • 你对这些意想不到的值是什么样子以及为什么会出现有任何解释吗?
    • -1 代表FUD。如果您想断言某些东西已损坏,请提供损坏的演示 - 而不是一个模糊且不可测试的断言,即 “您可能会得到意外的值”
    • 运行 InfluxDB 1.7.9,此查询为表/测量返回多个结果。显然这仅适用于一个系列。
    • 刚刚检查了“EXPLAIN”并使用“LAST()”和“WHERE time > now() - 1h”似乎比使用“ORDER BY ... LIMIT”更好/更快,即使使用“GROUP BY" - 后者使用了所有的分片。
    • 那么在 InfluxDB 版本 > 0.8 中使用 FIRST() 快吗?
    【解决方案2】:
    SELECT last(value) FROM response_times WHERE time > now() - 1h;
    

    这应该返回列的最后一个值。

    但是,如果您愿意,可以将序列拆分为更小的部分并选择最后一个值。例如:

     SELECT last(value) FROM response_times WHERE time > now() - 1h GROUP BY time(60s);
    

    它将序列拆分为 60 秒的片段,并为每个片段获取最新值。

    【讨论】:

    • 如果它比 x 前长,这不会给你最后一个值。
    【解决方案3】:

    在 API 中,查看 first/last 以选择列的第一条或最后一条记录。 您还可以选择多个记录的顶部/底部

    [edit] 顶部/底部似乎返回时间范围的最高/最低值

    【讨论】:

    【解决方案4】:

    这是一个具体的示例,假设我们有数据:

    > select *,tag from measurement
    name: measurement
    time                 field_1    tag_1
    ----                 -------    ------
    2019-05-15T03:07:52Z 100      A
    2019-05-15T03:07:52Z 101      B
    2019-05-15T03:09:52Z 100      A
    2019-05-15T03:09:52Z 101      B
    

    并且您想获取最后两列(每个 tag_1 的最新记录), 那么你可以这样做:

    > select last(field_1),* from measurement group by *
    name: measurement
    tags: tag_1=A
    time                 last     field_1 
    ----                 ----    ------- 
    2019-05-15T03:09:52Z 100        100     
    
    name: measurement
    tags: tag_1=B
    time                 last  field_1 
    ----                 ----  ------- 
    2019-05-15T03:09:52Z 101    101 
    

    还有 grafana 上的可视化,它总是显示每个标签的最后记录

    【讨论】:

      【解决方案5】:
      SELECT * FROM <SERIES> ORDER BY ASC LIMIT 1
      

      【讨论】:

      • 最后一个值的 DESC。具有 LIMIT 1 的 ASC 将返回第一个。
      • 对于长系列,这也比选择WHERE time &gt; now - ...慢得多。
      【解决方案6】:

      LIMIT 没有错误或任何问题。是的,有一个,但它是关于 SLIMIT(系列限制)的。 LIMIT 可以安全地用于获取 前 n 条记录。

      简而言之,LIMIT 的语法:

      SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] LIMIT <N>
      

      SLIMIT 的语法:

      SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] GROUP BY *[,time(<time_interval>)] [ORDER_BY_clause] SLIMIT <N>
      

      您看到 GROUP BY 子句在 LIMIT 中是 [ optional ]。

      关于 LIMIT 和 SLIMIT 用法的详细解释,这里是version 1.5 document。 这是关于 SLIMIT 的ongoing issue

      【讨论】:

        【解决方案7】:

        如果您像我一样正在寻找相同的功能,但使用 Flux DSL(influx 2)。

        可以使用tail函数https://docs.influxdata.com/influxdb/v2.0/reference/flux/stdlib/built-in/transformations/tail/

        (...)
          |> tail(n: 1)
        

        last 功能对我不起作用。

        【讨论】:

          最近更新 更多