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_feet
measurement返回具有最新时间戳的点。没有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_level
。ORDER 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_level
。 LIMIT 2
请求两个最旧的十二分钟平均值。
请注意,没有LIMIT 2
,查询将返回每个series四个点; 在查询的时间范围内每隔十二分钟的时间间隔一个点。
SLIMIT子句
SLIMIT <N>
返回指定measurement的前
语法
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_level
。SLIMIT 1
要求返回与measurementh2o_feet
相关联的一个series。
请注意,如果没有SLIMIT 1
,查询将返回与h2o_feet
相关联的两个series的结果:location = coyote_creek
和location = santa_monica
。
LIMIT和SLIMIT一起使用
SLIMIT <N>
后面跟着LIMIT <N>
返回指定measurement的
语法
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,要求需要LIMIT
和SLIMIT
的查询才能包含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_level
。LIMIT 2
请求两个最早的十二分钟平均值,SLIMIT 1
请求与measurementh2o_feet
相关联的一个series。
请注意,如果没有LIMIT 2
SLIMIT 1
,查询将返回与h2o_feet
相关联的两个series中的每一个的四个点。
OFFSET和SOFFSET子句
OFFSET
和SOFFSET
分页和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_feet
和location = 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.145224194
到2262-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.145224194
到2262-04-11T23:47:16.854775806Z
。对于具有GROUP BY time()
子句的SELECT
语句,默认时间范围在UTC的1677-09-21 00:12:43.145224194
和now()
之间。
要查询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:00Z
和now()
之间的时间戳的数据:
> 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:00Z
和now()
之后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
可以是float
,integer
,string
和boolean
。在大多数情况下,如果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首先执行子查询,再次执行主查询。
主查询围绕子查询,至少需要SELECT
和FROM
子句。主查询支持本文档中列出的所有子句。
子查询显示在主查询的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``cats
和dogs
数量之间的差异的平均值。
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_level
的MEAN()
值,并将结果分组为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执行主查询,并计算location
的water_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
语句,系统会返回一个解析错误。