InfluxDb中的数据查询语法二


INTO子句的共同问题


问题一:丢数据

如果INTO查询在SELECT子句中包含tag key,则查询将当前measurement中的tag转换为目标measurement中的字段。这可能会导致InfluxDB覆盖以前由tag value区分的点。请注意,此行为不适用于使用TOP()BOTTOM()函数的查询。

要将当前measurement的tag保留在目标measurement中的tag中,GROUP BY相关tag key或INTO查询中的GROUP BY *


问题二:使用INTO子句自动查询

本文档中的INTO子句部分显示了如何使用INTO子句手动实现查询。 有关如何自动执行INTO子句查询实时数据,请参阅Continous Queries文档。除了其他用途之外,Continous Queries使采样过程自动化。


ORDER BY TIME DESC

默认情况下,InfluxDB以升序的顺序返回结果; 返回的第一个点具有最早的时间戳,返回的最后一个点具有最新的时间戳。 ORDER BY time DESC反转该顺序,使得InfluxDB首先返回具有最新时间戳的点。


语法

SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] ORDER BY time DESC

语法描述

如果查询包含GROUP BY子句,ORDER by time DESC必须出现在GROUP BY子句之后。如果查询包含一个WHERE子句并没有GROUP BY子句,ORDER by time DESC必须出现在WHERE子句之后。


例子


例一:首先返回最新的点
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' ORDER BY time DESC

name: h2o_feet
time                   water_level
----                   -----------
2015-09-18T21:42:00Z   4.938
2015-09-18T21:36:00Z   5.066
[...]
2015-08-18T00:06:00Z   2.116
2015-08-18T00:00:00Z   2.064

该查询首先从h2o_feetmeasurement返回具有最新时间戳的点。没有ORDER by time DESC,查询将首先返回2015-08-18T00:00:00Z最后返回2015-09-18T21:42:00Z


例二:首先返回最新的点并包括GROUP BY time()子句
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:42:00Z' GROUP BY time(12m) ORDER BY time DESC

name: h2o_feet
time                   mean
----                   ----
2015-08-18T00:36:00Z   4.6825
2015-08-18T00:24:00Z   4.80675
2015-08-18T00:12:00Z   4.950749999999999
2015-08-18T00:00:00Z   5.07625

该查询在GROUP BY子句中使用InfluxQL函数和时间间隔来计算查询时间范围内每十二分钟间隔的平均water_levelORDER BY time DESC返回最近12分钟的时间间隔。


LIMIT和SLIMIT子句

LIMIT <N>从指定的measurement中返回前N个数据点。


语法

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

语法描述

N指定从指定measurement返回的点数。如果N大于measurement的点总数,InfluxDB返回该measurement中的所有点。请注意,LIMIT子句必须以上述语法中列出的顺序显示。


例子


例一:限制返回的点数

> SELECT "water_level","location" FROM "h2o_feet" LIMIT 3

name: h2o_feet
time                   water_level   location
----                   -----------   --------
2015-08-18T00:00:00Z   8.12          coyote_creek
2015-08-18T00:00:00Z   2.064         santa_monica
2015-08-18T00:06:00Z   8.005         coyote_creek

这个查询从measurementh2o_feet中返回最旧的三个点。


例二:限制返回的点数并包含一个GROUP BY子句

> SELECT MEAN("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:42:00Z' GROUP BY *,time(12m) LIMIT 2

name: h2o_feet
tags: location=coyote_creek
time                   mean
----                   ----
2015-08-18T00:00:00Z   8.0625
2015-08-18T00:12:00Z   7.8245

name: h2o_feet
tags: location=santa_monica
time                   mean
----                   ----
2015-08-18T00:00:00Z   2.09
2015-08-18T00:12:00Z   2.077

该查询使用InfluxQL函数和GROUP BY子句来计算每个tag以及查询时间内每隔十二分钟的间隔的平均water_levelLIMIT 2请求两个最旧的十二分钟平均值。

请注意,没有LIMIT 2,查询将返回每个series四个点; 在查询的时间范围内每隔十二分钟的时间间隔一个点。


SLIMIT子句

SLIMIT <N>返回指定measurement的前个series中的每一个点。


语法

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

语法描述

N表示从指定measurement返回的序列数。如果N大于measurement中的series数,InfluxDB将从该measurement中返回所有series。

有一个issue,要求使用SLIMIT来查询GROUP BY *。 请注意,SLIMIT子句必须按照上述语法中的顺序显示。


例子


例一:限制返回的series的数目

> SELECT "water_level" FROM "h2o_feet" GROUP BY * SLIMIT 1

name: h2o_feet
tags: location=coyote_creek
time                   water_level
----                   -----
2015-08-18T00:00:00Z   8.12
2015-08-18T00:06:00Z   8.005
2015-08-18T00:12:00Z   7.887
[...]
2015-09-18T16:12:00Z   3.402
2015-09-18T16:18:00Z   3.314
2015-09-18T16:24:00Z   3.235

该查询从measurementh2o_feet中返回一个series的所有点。


例二:限制返回的series的数目并且包括一个GROUP BY time()子句

> SELECT MEAN("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:42:00Z' GROUP BY *,time(12m) SLIMIT 1

name: h2o_feet
tags: location=coyote_creek
time                   mean
----                   ----
2015-08-18T00:00:00Z   8.0625
2015-08-18T00:12:00Z   7.8245
2015-08-18T00:24:00Z   7.5675
2015-08-18T00:36:00Z   7.303

该查询在GROUP BY子句中使用InfluxQL函数和时间间隔来计算查询时间范围内每十二分钟间隔的平均water_levelSLIMIT 1要求返回与measurementh2o_feet相关联的一个series。

请注意,如果没有SLIMIT 1,查询将返回与h2o_feet相关联的两个series的结果:location = coyote_creeklocation = santa_monica


LIMIT和SLIMIT一起使用

SLIMIT <N>后面跟着LIMIT <N>返回指定measurement的个series中的个数据点。


语法

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

语法描述

N1指定每次measurement返回的点数。如果N1大于measurement的点数,InfluxDB将从该测量中返回所有点。

N2指定从指定measurement返回的series数。如果N2大于measurement中series联数,InfluxDB将从该measurement中返回所有series。

有一个issue,要求需要LIMITSLIMIT的查询才能包含GROUP BY *


例子


例一:限制数据点数和series数的返回

> SELECT "water_level" FROM "h2o_feet" GROUP BY * LIMIT 3 SLIMIT 1

name: h2o_feet
tags: location=coyote_creek
time                   water_level
----                   -----------
2015-08-18T00:00:00Z   8.12
2015-08-18T00:06:00Z   8.005
2015-08-18T00:12:00Z   7.887

该查询从measurementh2o_feet中的一个series钟返回最老的三个点。


例二:限制数据点数和series数并且包括一个GROUP BY time()子句

> SELECT MEAN("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:42:00Z' GROUP BY *,time(12m) LIMIT 2 SLIMIT 1

name: h2o_feet
tags: location=coyote_creek
time                   mean
----                   ----
2015-08-18T00:00:00Z   8.0625
2015-08-18T00:12:00Z   7.8245

该查询在GROUP BY子句中使用InfluxQL函数和时间间隔来计算查询时间范围内每十二分钟间隔的平均water_levelLIMIT 2请求两个最早的十二分钟平均值,SLIMIT 1请求与measurementh2o_feet相关联的一个series。

请注意,如果没有LIMIT 2 SLIMIT 1,查询将返回与h2o_feet相关联的两个series中的每一个的四个点。


OFFSET和SOFFSET子句

OFFSETSOFFSET分页和series返回。


OFFSET子句

OFFSET <N>从查询结果中返回分页的N个数据点


语法

SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] LIMIT_clause OFFSET <N> [SLIMIT_clause]

语法描述

N指定分页数。OFFSET子句需要一个LIMIT子句。使用没有LIMIT子句的OFFSET子句可能会导致不一致的查询结果。


例子


例一:分页数据点

> SELECT "water_level","location" FROM "h2o_feet" LIMIT 3 OFFSET 3

name: h2o_feet
time                   water_level   location
----                   -----------   --------
2015-08-18T00:06:00Z   2.116         santa_monica
2015-08-18T00:12:00Z   7.887         coyote_creek
2015-08-18T00:12:00Z   2.028         santa_monica

该查询从measurementh2o_feet中返回第4,5,6个数据点,如果查询语句中不包括OFFSET 3,则会返回measurement中的第1,2,3个数据点。


例二:分页数据点并包括多个子句

> SELECT MEAN("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:42:00Z' GROUP BY *,time(12m) ORDER BY time DESC LIMIT 2 OFFSET 2 SLIMIT 1

name: h2o_feet
tags: location=coyote_creek
time                   mean
----                   ----
2015-08-18T00:12:00Z   7.8245
2015-08-18T00:00:00Z   8.0625

这个例子包含的东西很多,我们一个一个来看:

  • SELECT指明InfluxQL的函数;
  • FROM指明单个measurement;
  • WHERE指明查询的时间范围;
  • GROUP BY将结果对所有tag作group by;
  • GROUP BY time DESC按照时间戳的降序返回结果;
  • LIMIT 2限制返回的点数为2;
  • OFFSET 2查询结果中不包括最开始的两个值;
  • SLIMIT 1限制返回的series数目为1;

如果没有OFFSET 2,查询将会返回最先的两个点:

name: h2o_feet
tags: location=coyote_creek
time                   mean
----                   ----
2015-08-18T00:36:00Z   7.303
2015-08-18T00:24:00Z   7.5675

SOFFSET子句

SOFFSET <N>从查询结果中返回分页的N个series


语法

SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] GROUP BY *[,time(time_interval)] [ORDER_BY_clause] [LIMIT_clause] [OFFSET_clause] SLIMIT_clause SOFFSET <N>

语法描述

N指定series的分页数。SOFFSET子句需要一个SLIMIT子句。使用没有SLIMIT子句的SOFFSET子句可能会导致不一致的查询结果。

注意:如果SOFFSET指定的大于series的数目,则InfluxDB返回空值。


例子


例一:分页series

> SELECT "water_level" FROM "h2o_feet" GROUP BY * SLIMIT 1 SOFFSET 1

name: h2o_feet
tags: location=santa_monica
time                   water_level
----                   -----------
2015-08-18T00:00:00Z   2.064
2015-08-18T00:06:00Z   2.116
[...]
2015-09-18T21:36:00Z   5.066
2015-09-18T21:42:00Z   4.938

查询返回与h2o_feet相关的series数据,并返回taglocation = santa_monica。没有SOFFSET 1,查询返回与h2o_feetlocation = coyote_creek相关的series的所有数据。


例二:分页series并包括多个子句

> SELECT MEAN("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:42:00Z' GROUP BY *,time(12m) ORDER BY time DESC LIMIT 2 OFFSET 2 SLIMIT 1 SOFFSET 1

name: h2o_feet
tags: location=santa_monica
time                   mean
----                   ----
2015-08-18T00:12:00Z   2.077
2015-08-18T00:00:00Z   2.09

这个例子包含的东西很多,我们一个一个来看:

  • SELECT指明InfluxQL的函数;
  • FROM指明单个measurement;
  • WHERE指明查询的时间范围;
  • GROUP BY将结果对所有tag作group by;
  • GROUP BY time DESC按照时间戳的降序返回结果;
  • LIMIT 2限制返回的点数为2;
  • OFFSET 2查询结果中不包括最开始的两个值;
  • SLIMIT 1限制返回的series数目为1;
  • SOFFSET 1分页返回的series;

如果没有SOFFSET 2,查询将会返回不同的series:

name: h2o_feet
tags: location=coyote_creek
time                   mean
----                   ----
2015-08-18T00:12:00Z   7.8245
2015-08-18T00:00:00Z   8.0625

Time Zone子句

tz()子句返回指定时区的UTC偏移量。


语法

SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] [LIMIT_clause] [OFFSET_clause] [SLIMIT_clause] [SOFFSET_clause] tz('<time_zone>')

语法描述

默认情况下,InfluxDB以UTC为单位存储并返回时间戳。 tz()子句包含UTC偏移量,或UTC夏令时(DST)偏移量到查询返回的时间戳中。 返回的时间戳必须是RFC3339格式,用于UTC偏移量或UTC DST才能显示。time_zone参数遵循Internet Assigned Numbers Authority时区数据库中的TZ语法,它需要单引号。


例子


例一:返回从UTC偏移到芝加哥时区的数据

> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:18:00Z' tz('America/Chicago')

name: h2o_feet
time                       water_level
----                       -----------
2015-08-17T19:00:00-05:00  2.064
2015-08-17T19:06:00-05:00  2.116
2015-08-17T19:12:00-05:00  2.028
2015-08-17T19:18:00-05:00  2.126

查询的结果包括UTC偏移-5个小时的美国芝加哥时区的时间戳。


时间语法

对于大多数SELECT语句,默认时间范围为UTC的1677-09-21 00:12:43.1452241942262-04-11T23:47:16.854775806Z。 对于具有GROUP BY time()子句的SELECT语句,默认时间范围在UTC的1677-09-21 00:12:43.145224194和now()之间。以下部分详细说明了如何在SELECT语句的WHERE子句中指定替代时间范围。


绝对时间

用时间字符串或是epoch时间来指定绝对时间


语法

SELECT_clause FROM_clause WHERE time <operator> ['<rfc3339_date_time_string>' | '<rfc3339_like_date_time_string>' | <epoch_time>] [AND ['<rfc3339_date_time_string>' | '<rfc3339_like_date_time_string>' | <epoch_time>] [...]]

语法描述


支持的操作符

= 等于
<> 不等于
!= 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于

最近,InfluxDB不再支持在WHERE的绝对时间里面使用OR了。


rfc3399时间字符串
'YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ'

.nnnnnnnnn是可选的,如果没有的话,默认是.00000000,rfc3399格式的时间字符串要用单引号引起来。


epoch_time

Epoch时间是1970年1月1日星期四00:00:00(UTC)以来所经过的时间。默认情况下,InfluxDB假定所有epoch时间戳都是纳秒。也可以在epoch时间戳的末尾包括一个表示时间精度的字符,以表示除纳秒以外的精度。


基本算术

所有时间戳格式都支持基本算术。用表示时间精度的字符添加(+)或减去(-)一个时间。请注意,InfluxQL需要+或-和表示时间精度的字符之间用空格隔开。


例子


例一:指定一个RFC3339格式的时间间隔
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18T00:00:00.000000000Z' AND time <= '2015-08-18T00:12:00Z'

name: h2o_feet
time                   water_level
----                   -----------
2015-08-18T00:00:00Z   2.064
2015-08-18T00:06:00Z   2.116
2015-08-18T00:12:00Z   2.028

该查询会返回时间戳在2015年8月18日00:00:00.000000000和2015年8月18日00:12:00之间的数据。 第一个时间戳(.000000000)中的纳秒是可选的。

请注意,RFC3339日期时间字符串必须用单引号引起来。


例二:指定一个类似于RFC3339格式的时间间隔
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18' AND time <= '2015-08-18 00:12:00'

name: h2o_feet
time                   water_level
----                   -----------
2015-08-18T00:00:00Z   2.064
2015-08-18T00:06:00Z   2.116
2015-08-18T00:12:00Z   2.028

该查询会返回时间戳在2015年8月18日00:00:00和2015年8月18日00:12:00之间的数据。 第一个日期时间字符串不包含时间; InfluxDB会假设时间是00:00:00。


例三:指定epoch格式的时间间隔
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= 1439856000000000000 AND time <= 1439856720000000000

name: h2o_feet
time                   water_level
----                   -----------
2015-08-18T00:00:00Z   2.064
2015-08-18T00:06:00Z   2.116
2015-08-18T00:12:00Z   2.028

该查询返回的数据的时间戳为2015年8月18日00:00:00和2015年8月18日00:12:00之间。默认情况下,InfluxDB处理epoch格式下时间戳为纳秒。


例四:指定epoch以秒为精度的时间间隔
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= 1439856000s AND time <= 1439856720s

name: h2o_feet
time                   water_level
----                   -----------
2015-08-18T00:00:00Z   2.064
2015-08-18T00:06:00Z   2.116
2015-08-18T00:12:00Z   2.028

该查询返回的数据的时间戳为2015年8月18日00:00:00和2015年8月18日00:12:00之间。在epoch时间戳结尾处的s表示时间戳以秒为单位。


例五:对RFC3339格式的时间戳的基本计算
> SELECT "water_level" FROM "h2o_feet" WHERE time > '2015-09-18T21:24:00Z' + 6m

name: h2o_feet
time                   water_level
----                   -----------
2015-09-18T21:36:00Z   5.066
2015-09-18T21:42:00Z   4.938

该查询返回数据,其时间戳在2015年9月18日21时24分后六分钟。请注意,+6m之间的空格是必需的。


例六:对epoch时间戳的基本计算
> SELECT "water_level" FROM "h2o_feet" WHERE time > 24043524m - 6m

name: h2o_feet
time                   water_level
----                   -----------
2015-09-18T21:24:00Z   5.013
2015-09-18T21:30:00Z   5.01
2015-09-18T21:36:00Z   5.066
2015-09-18T21:42:00Z   4.938

该查询返回数据,其时间戳在2015年9月18日21:24:00之前六分钟。请注意,-6m之间的空格是必需的。


相对时间

使用now()查询时间戳相对于服务器当前时间戳的的数据。


语法

SELECT_clause FROM_clause WHERE time <operator> now() [[ - | + ] <duration_literal>] [(AND|OR) now() [...]]

语法描述

now()是在该服务器上执行查询时服务器的Unix时间。-+和时间字符串之间需要空格。


支持的操作符

= 等于
<> 不等于
!= 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于


时间字符串

uµ 微秒
ms 毫秒
s
m 分钟
h 小时
d
w 星期


例子


例一:用相对时间指定时间间隔
> SELECT "water_level" FROM "h2o_feet" WHERE time > now() - 1h

该查询返回过去一个小时的数据。


例二:用绝对和相对时间指定时间间隔
> SELECT "level description" FROM "h2o_feet" WHERE time > '2015-09-18T21:18:00Z' AND time < now() + 1000d

name: h2o_feet
time                   level description
----                   -----------------
2015-09-18T21:24:00Z   between 3 and 6 feet
2015-09-18T21:30:00Z   between 3 and 6 feet
2015-09-18T21:36:00Z   between 3 and 6 feet
2015-09-18T21:42:00Z   between 3 and 6 feet

该查询返回的数据的时间戳在2015年9月18日的21:18:00到从现在之后1000天之间。


时间语法的一些常见问题


问题一:在绝对时间中使用OR

当前,InfluxDB不支持在绝对时间的WHERE子句中使用OR


问题二:在有GROUP BY time()中查询发生在now()之后的数据

大多数SELECT语句的默认时间范围为UTC的1677-09-21 00:12:43.1452241942262-04-11T23:47:16.854775806Z。对于具有GROUP BY time()子句的SELECT语句,默认时间范围在UTC的1677-09-21 00:12:43.145224194now()之间。

要查询now()之后发生的时间戳的数据,具有GROUP BY time()子句的SELECT语句必须在WHERE子句中提供一个时间的上限。


例子

使用CLI写入数据库NOAA_water_database,且发生在now()之后的数据点。

> INSERT h2o_feet,location=santa_monica water_level=3.1 1587074400000000000

运行GROUP BY time()查询,涵盖2015-09-18T21:30:00Znow()之间的时间戳的数据:

> SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location"='santa_monica' AND time >= '2015-09-18T21:30:00Z' GROUP BY time(12m) fill(none)

name: h2o_feet
time                   mean
----                   ----
2015-09-18T21:24:00Z   5.01
2015-09-18T21:36:00Z   5.002

运行GROUP BY time()查询,涵盖2015-09-18T21:30:00Znow()之后180星期之间的时间戳的数据:

 > SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location"='santa_monica' AND time >= '2015-09-18T21:30:00Z' AND time <= now() + 180w GROUP BY time(12m) fill(none)

name: h2o_feet
time                   mean
----                   ----
2015-09-18T21:24:00Z   5.01
2015-09-18T21:36:00Z   5.002
2020-04-16T22:00:00Z   3.1

  请注意,WHERE子句必须提供替代上限来覆盖默认的now()上限。 以下查询仅将下限重置为now(),这样查询的时间范围在now()now()之间:

> SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location"='santa_monica' AND time >= now() GROUP BY time(12m) fill(none)
>

问题三:配置返回的时间戳

默认情况下,CLI以纳秒时间格式返回时间戳。使用precision <format>命令指定替代格式。默认情况下,HTTP API返回RFC3339格式的时间戳。使用epoch查询参数指定替代格式。


正则表达式

InluxDB支持在以下场景使用正则表达式:

  • SELECT中的field key和tag key;
  • FROM中的measurement
  • WHERE中的tag value和字符串类型的field value
  • GROUP BY中的tag key

目前,InfluxQL不支持在WHERE中使用正则表达式去匹配不是字符串的field value,以及数据库名和retention policy。

注意:正则表达式比精确的字符串更加耗费计算资源; 具有正则表达式的查询比那些没有的性能要低一些。


语法

SELECT /<regular_expression_field_key>/ FROM /<regular_expression_measurement>/ WHERE [<tag_key> <operator> /<regular_expression_tag_value>/ | <field_key> <operator> /<regular_expression_field_value>/] GROUP BY /<regular_expression_tag_key>/

语法描述

正则表达式前后使用斜杠/,并且使用Golang的正则表达式语法

支持的操作符:

=~ 匹配
!~ 不匹配


例子:


例一:在SELECT中使用正则表达式指定field key和tag key

> SELECT /l/ FROM "h2o_feet" LIMIT 1

name: h2o_feet
time                   level description      location       water_level
----                   -----------------      --------       -----------
2015-08-18T00:00:00Z   between 6 and 9 feet   coyote_creek   8.12

查询选择所有包含l的tag key和field key。请注意,SELECT子句中的正则表达式必须至少匹配一个field key,以便返回与正则表达式匹配的tag key。

目前,没有语法来区分SELECT子句中field key的正则表达式和tag key的正则表达式。不支持语法/<regular_expression>/::[field | tag]


例二:在SELECT中使用正则表达式指定函数里面的field key

> SELECT DISTINCT(/level/) FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18T00:00:00.000000000Z' AND time <= '2015-08-18T00:12:00Z'

name: h2o_feet
time                   distinct_level description   distinct_water_level
----                   --------------------------   --------------------
2015-08-18T00:00:00Z   below 3 feet                 2.064
2015-08-18T00:00:00Z                                2.116
2015-08-18T00:00:00Z                                2.028

该查询使用InfluxQL函数返回每个包含level的field key的去重后的field value。


例三:在FROM中使用正则表达式指定measurement

> SELECT MEAN("degrees") FROM /temperature/

name: average_temperature
time			mean
----			----
1970-01-01T00:00:00Z   79.98472932232272

name: h2o_temperature
time			mean
----			----
1970-01-01T00:00:00Z   64.98872722506226

该查询使用InfluxQL函数计算在数据库NOAA_water_database中包含temperature的每个measurement的平均degrees


例四:在WHERE中使用正则表达式指定tag value

> SELECT MEAN(water_level) FROM "h2o_feet" WHERE "location" =~ /[m]/ AND "water_level" > 3

name: h2o_feet
time                   mean
----                   ----
1970-01-01T00:00:00Z   4.47155532049926

该查询使用InfluxQL函数来计算平均水位,其中location的tag value包括m并且water_level大于3。


例五:在WHERE中使用正则表达式指定无值的tag

> SELECT * FROM "h2o_feet" WHERE "location" !~ /./
>

该查询从measurementh2o_feet中选择所有数据,其中tag location没有值。NOAA_water_database中的每个数据点都具有location这个tag。


例六:在WHERE中使用正则表达式指定有值的tag

> SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location" =~ /./

name: h2o_feet
time                   mean
----                   ----
1970-01-01T00:00:00Z   4.442107025822523

该查询使用InfluxQL函数计算所有location这个tag的数据点的平均water_level


例七:在WHERE中使用正则表达式指定一个field value

> SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location" = 'santa_monica' AND "level description" =~ /between/

name: h2o_feet
time                   mean
----                   ----
1970-01-01T00:00:00Z   4.47155532049926

该查询使用InfluxQL函数计算所有字段level description的值含有between的数据点的平均water_level


例八:在GROUP BY中使用正则表达式指定tag key

> SELECT FIRST("index") FROM "h2o_quality" GROUP BY /l/

name: h2o_quality
tags: location=coyote_creek
time                   first
----                   -----
2015-08-18T00:00:00Z   41

name: h2o_quality
tags: location=santa_monica
time                   first
----                   -----
2015-08-18T00:00:00Z   99

该查询使用InfluxQL函数查询每个tag key包含字母l的tag的第一个index值。


数据类型和转换

SELECT中支持指定field的类型,以及使用::完成基本的类型转换。


数据类型

field的value支持浮点,整数,字符串和布尔型。::语法允许用户在查询中指定field的类型。

注意:一般来说,没有必要在SELECT子句中指定字段值类型。 在大多数情况下,InfluxDB拒绝尝试将字段值写入以前接受的不同类型的字段值的字段的任何数据。字段值类型可能在分片组之间不同。在这些情况下,可能需要在SELECT子句中指定字段值类型。


语法

SELECT_clause <field_key>::<type> FROM_clause

语法描述

type可以是floatintegerstringboolean。在大多数情况下,如果field_key没有存储指定type的数据,那么InfluxDB将不会返回数据。


例子

> SELECT "water_level"::float FROM "h2o_feet" LIMIT 4

name: h2o_feet
--------------
time                   water_level
2015-08-18T00:00:00Z   8.12
2015-08-18T00:00:00Z   2.064
2015-08-18T00:06:00Z   8.005
2015-08-18T00:06:00Z   2.116

该查询返回field keywater_level为浮点型的数据。


类型转换

::语法允许用户在查询中做基本的数据类型转换。目前,InfluxDB支持冲整数转到浮点,或者从浮点转到整数。


语法

SELECT_clause <field_key>::<type> FROM_clause

语法描述

type可以是float或者integer

如果查询试图把整数或者浮点数转换成字符串或者布尔型,InfluxDB将不会返回数据。


例子


例一:浮点数转换成整型
> SELECT "water_level"::integer FROM "h2o_feet" LIMIT 4

name: h2o_feet
--------------
time                   water_level
2015-08-18T00:00:00Z   8
2015-08-18T00:00:00Z   2
2015-08-18T00:06:00Z   8
2015-08-18T00:06:00Z   2

例一:浮点数转换成字符串(目前不支持)
> SELECT "water_level"::string FROM "h2o_feet" LIMIT 4
>

所有返回为空。


多语句

用分号;分割多个SELECT语句。


例子


CLI:

> SELECT MEAN("water_level") FROM "h2o_feet"; SELECT "water_level" FROM "h2o_feet" LIMIT 2

name: h2o_feet
time                   mean
----                   ----
1970-01-01T00:00:00Z   4.442107025822522

name: h2o_feet
time                   water_level
----                   -----------
2015-08-18T00:00:00Z   8.12
2015-08-18T00:00:00Z   2.064

HTTP API

{
    "results": [
        {
            "statement_id": 0,
            "series": [
                {
                    "name": "h2o_feet",
                    "columns": [
                        "time",
                        "mean"
                    ],
                    "values": [
                        [
                            "1970-01-01T00:00:00Z",
                            4.442107025822522
                        ]
                    ]
                }
            ]
        },
        {
            "statement_id": 1,
            "series": [
                {
                    "name": "h2o_feet",
                    "columns": [
                        "time",
                        "water_level"
                    ],
                    "values": [
                        [
                            "2015-08-18T00:00:00Z",
                            8.12
                        ],
                        [
                            "2015-08-18T00:00:00Z",
                            2.064
                        ]
                    ]
                }
            ]
        }
    ]
}

子查询

子查询是嵌套在另一个查询的FROM子句中的查询。使用子查询将查询作为条件应用于其他查询。子查询提供与嵌套函数和SQLHAVING子句类似的功能。


语法

SELECT_clause FROM ( SELECT_statement ) [...]

语法描述

InfluxDB首先执行子查询,再次执行主查询。

主查询围绕子查询,至少需要SELECTFROM子句。主查询支持本文档中列出的所有子句。

子查询显示在主查询的FROM子句中,它需要附加的括号。 子查询支持本文档中列出的所有子句。

InfluxQL每个主要查询支持多个嵌套子查询。 多个子查询的示例语法:

SELECT_clause FROM ( SELECT_clause FROM ( SELECT_statement ) [...] ) [...]

例子


例一:计算多个MAX()值的SUM()

> SELECT SUM("max") FROM (SELECT MAX("water_level") FROM "h2o_feet" GROUP BY "location")

name: h2o_feet
time                   sum
----                   ---
1970-01-01T00:00:00Z   17.169

该查询返回location的每个tag值之间的最大water_level的总和。

InfluxDB首先执行子查询; 它计算每个tag值的water_level的最大值:

> SELECT MAX("water_level") FROM "h2o_feet" GROUP BY "location"
name: h2o_feet

tags: location=coyote_creek
time                   max
----                   ---
2015-08-29T07:24:00Z   9.964

name: h2o_feet
tags: location=santa_monica
time                   max
----                   ---
2015-08-29T03:54:00Z   7.205

接下来,InfluxDB执行主查询并计算这些最大值的总和:9.964 + 7.205 = 17.169。 请注意,主查询将max(而不是water_level)指定为SUM()函数中的字段键。


例二:计算两个field的差值的MEAN()

> SELECT MEAN("difference") FROM (SELECT "cats" - "dogs" AS "difference" FROM "pet_daycare")

name: pet_daycare
time                   mean
----                   ----
1970-01-01T00:00:00Z   1.75

查询返回measurementpet_daycare``catsdogs数量之间的差异的平均值。

InfluxDB首先执行子查询。 子查询计算cats字段中的值和dogs字段中的值之间的差值,并命名输出列difference

> SELECT "cats" - "dogs" AS "difference" FROM "pet_daycare"

name: pet_daycare
time                   difference
----                   ----------
2017-01-20T00:55:56Z   -1
2017-01-21T00:55:56Z   -49
2017-01-22T00:55:56Z   66
2017-01-23T00:55:56Z   -9

接下来,InfluxDB执行主要查询并计算这些差的平均值。请注意,主查询指定difference作为MEAN()函数中的字段键。


例三:计算MEAN()然后将这些平均值作为条件

> SELECT "all_the_means" FROM (SELECT MEAN("water_level") AS "all_the_means" FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m) ) WHERE "all_the_means" > 5

name: h2o_feet
time                   all_the_means
----                   -------------
2015-08-18T00:00:00Z   5.07625

该查询返回water_level的平均值大于5的所有平均值。

InfluxDB首先执行子查询。子查询从2015-08-18T00:00:00Z到2015-08-18T00:30:00Z计算water_levelMEAN()值,并将结果分组为12分钟。它也命名输出列all_the_means

> SELECT MEAN("water_level") AS "all_the_means" FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m)

name: h2o_feet
time                   all_the_means
----                   -------------
2015-08-18T00:00:00Z   5.07625
2015-08-18T00:12:00Z   4.950749999999999
2015-08-18T00:24:00Z   4.80675

接下来,InfluxDB执行主查询,只返回大于5的平均值。请注意,主查询将all_the_means指定为SELECT子句中的字段键。


例四:计算多个DERIVATIVE()值得SUM()

> SELECT SUM("water_level_derivative") AS "sum_derivative" FROM (SELECT DERIVATIVE(MEAN("water_level")) AS "water_level_derivative" FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m),"location") GROUP BY "location"

name: h2o_feet
tags: location=coyote_creek
time                   sum_derivative
----                   --------------
1970-01-01T00:00:00Z   -0.4950000000000001

name: h2o_feet
tags: location=santa_monica
time                   sum_derivative
----                   --------------
1970-01-01T00:00:00Z   -0.043999999999999595

查询返回每个tag location的平均water_level的导数之和。

InfluxDB首先执行子查询。子查询计算以12分钟间隔获取的平均water_level的导数。它对location的每个tag value进行计算,并将输出列命名为water_level_derivative

> SELECT DERIVATIVE(MEAN("water_level")) AS "water_level_derivative" FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m),"location"

name: h2o_feet
tags: location=coyote_creek
time                   water_level_derivative
----                   ----------------------
2015-08-18T00:12:00Z   -0.23800000000000043
2015-08-18T00:24:00Z   -0.2569999999999997

name: h2o_feet
tags: location=santa_monica
time                   water_level_derivative
----                   ----------------------
2015-08-18T00:12:00Z   -0.0129999999999999
2015-08-18T00:24:00Z   -0.030999999999999694

接下来,InfluxDB执行主查询,并计算locationwater_level_derivative值的总和。请注意,主要查询指定了water_level_derivative,而不是water_level或者derivative,作为SUM()函数中的字段键。


子查询的常见问题


子查询中多个SELECT语句

InfluxQL支持在每个主查询中嵌套多个子查询:

SELECT_clause FROM ( SELECT_clause FROM ( SELECT_statement ) [...] ) [...]
                     ------------------   ----------------
                         Subquery 1          Subquery 2

InfluxQL不支持每个子查询中多个SELECT语句:

SELECT_clause FROM (SELECT_statement; SELECT_statement) [...]

如果一个子查询中多个SELECT语句,系统会返回一个解析错误。