InfluxDB - 仅获取查询中的最后一个值
InfluxDB - Getting only last value in query
是否可以仅查询查询结果的最后一个值(或第 n 个值)?
例如,在查询中:
SELECT value FROM response_times WHERE time > now() - 1h limit 1000;
是否可以只获取最后一个值,即时间上更早的值(可能是第 1000 个元素)?
当然我可以全部取回然后跳到最后一个,但我不想这样浪费带宽。
在API中查看first/last到select列的第一条或最后一条记录。
您还有 top/bottom 到 select 条以上的记录
[edit] top/bottom 似乎 return higest/lowest 时间范围的值
SELECT last(value) FROM response_times WHERE time > now() - 1h;
那应该 return 列的最后一个值。
但是,如果您愿意,可以将序列拆分成更小的部分,select 最后一个值。例如:
SELECT last(value) FROM response_times WHERE time > now() - 1h GROUP BY time(60s);
它将序列分成 60 秒的片段,并为每个片段选取最新值。
如果您使用的是 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 *,否则您可能会得到意想不到的值。
SELECT * FROM <SERIES> ORDER BY ASC LIMIT 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 中是[可选]。
关于LIMIT和SLIMIT用法的详细说明,这里是version 1.5 document。
这是关于 SLIMIT 的ongoing issue。
这是一个具体的例子,假设我们有数据:
> 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 上的可视化,它将始终显示每个标签的最后记录
如果您像我一样正在寻找相同的功能,但使用 Flux DSL(influx 2)。
可以使用tail函数https://docs.influxdata.com/influxdb/v2.0/reference/flux/stdlib/built-in/transformations/tail/
(...)
|> tail(n: 1)
last 函数对我不起作用。
是否可以仅查询查询结果的最后一个值(或第 n 个值)?
例如,在查询中:
SELECT value FROM response_times WHERE time > now() - 1h limit 1000;
是否可以只获取最后一个值,即时间上更早的值(可能是第 1000 个元素)?
当然我可以全部取回然后跳到最后一个,但我不想这样浪费带宽。
在API中查看first/last到select列的第一条或最后一条记录。 您还有 top/bottom 到 select 条以上的记录
[edit] top/bottom 似乎 return higest/lowest 时间范围的值
SELECT last(value) FROM response_times WHERE time > now() - 1h;
那应该 return 列的最后一个值。
但是,如果您愿意,可以将序列拆分成更小的部分,select 最后一个值。例如:
SELECT last(value) FROM response_times WHERE time > now() - 1h GROUP BY time(60s);
它将序列分成 60 秒的片段,并为每个片段选取最新值。
如果您使用的是 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 *,否则您可能会得到意想不到的值。
SELECT * FROM <SERIES> ORDER BY ASC LIMIT 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 中是[可选]。
关于LIMIT和SLIMIT用法的详细说明,这里是version 1.5 document。 这是关于 SLIMIT 的ongoing issue。
这是一个具体的例子,假设我们有数据:
> 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 上的可视化,它将始终显示每个标签的最后记录
如果您像我一样正在寻找相同的功能,但使用 Flux DSL(influx 2)。
可以使用tail函数https://docs.influxdata.com/influxdb/v2.0/reference/flux/stdlib/built-in/transformations/tail/
(...)
|> tail(n: 1)
last 函数对我不起作用。