26

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

例如,在查询中:

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

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

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

4

7 回答 7

46

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

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

第一个值:

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

最后一个值:

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

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

于 2016-03-23T16:59:11.513 回答
20
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 秒的片段,并为每个片段获取最新值。

于 2015-04-23T16:23:20.953 回答
7

In the API, have a look at first/last to select the first or last record of a column. You also have top/bottom to select more than one record

[edit] top/bottom seem to return higest/lowest values of the time frame

于 2015-04-09T08:17:28.590 回答
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 上的可视化,它总是会显示每个标签的最后记录 在此处输入图像描述

于 2019-05-15T03:26:30.307 回答
2
SELECT * FROM <SERIES> ORDER BY ASC LIMIT 1
于 2017-05-24T11:24:27.957 回答
1

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 用法的详细解释,这里是1.5 版本的文档。这是关于 SLIMIT的持续问题。

于 2018-05-03T10:45:07.117 回答
0

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

您可以使用尾部功能https://docs.influxdata.com/influxdb/v2.0/reference/flux/stdlib/built-in/transformations/tail/

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

最后一个功能对我不起作用。

于 2021-07-05T11:43:12.587 回答