选择函数

更新时间:

本文档主要介绍了选择函数(Selectors)的语法结构、语法说明以及使用示例。

BOTTOM()

返回最小的N个field value。

语法

SELECT BOTTOM(<field_key>[,<tag_key(s)>],<N>)[,<tag_key(s)>|<field_key(s)>][INTO_clause] FROM_clause [WHERE_clause][GROUP_BY_clause][ORDER_BY_clause][LIMIT_clause][OFFSET_clause][SLIMIT_clause][SOFFSET_clause]

语法说明

BOTTOM(field_key,N):返回field key对应的最小的N个值。

BOTTOM(field_key,tag_key(s),N):返回tag key的N个tag value对应的field key的最小值。

BOTTOM(field_key,N),tag_key(s),field_key(s):返回括号中的field key对应的最小的N个值,以及相关的tag和/或field。

BOTTOM():支持数据类型为int64和float64的field value。

说明

如果最小值有两个或多个相等的值,BOTTOM()返回具有最早时间戳的field value。当BOTTOM()函数与INTO子句一起使用时,BOTTOM()与其它InfluxQL函数不同。

示例1:选择指定field key对应的最小的三个值

SELECT BOTTOM("water_level",3) FROM "h2o_feet"

name: h2o_feet
time                   bottom
----------
2015-08-29T14:30:00Z-0.61
2015-08-29T14:36:00Z-0.591
2015-08-30T15:18:00Z-0.594

该查询返回measurement h2o_feet中field key water_level对应的最小的三个值。

示例2:选择两个tag对应的field key的最小值

SELECT BOTTOM("water_level","location",2) FROM "h2o_feet"

name: h2o_feet
time                   bottom   location
------------------
2015-08-29T10:36:00Z-0.243   santa_monica
2015-08-29T14:30:00Z-0.61    coyote_creek

该查询返回tag key location的两个tag value对应的field key water_level的最小值。

示例3:选择指定field key对应的最小的四个值以及相关的tag和field

SELECT BOTTOM("water_level",4),"location","level description" FROM "h2o_feet"

name: h2o_feet
time                  bottom  location      level description
-----------------------------------
2015-08-29T14:24:00Z-0.587  coyote_creek  below 3 feet
2015-08-29T14:30:00Z-0.61   coyote_creek  below 3 feet
2015-08-29T14:36:00Z-0.591  coyote_creek  below 3 feet
2015-08-30T15:18:00Z-0.594  coyote_creek  below 3 feet

该查询返回field key water_level对应的最小的四个值,以及相关的tag key location和field key level description的值。

示例4:选择指定field key对应的最小的三个值并包含多个子句

SELECT BOTTOM("water_level",3),"location" FROM "h2o_feet" WHERE time >='2015-08-18T00:00:00Z' AND time <='2015-08-18T00:54:00Z' GROUP BY time(24m) ORDER BY time DESC

name: h2o_feet
time                  bottom  location
------------------
2015-08-18T00:48:00Z1.991   santa_monica
2015-08-18T00:54:00Z2.054   santa_monica
2015-08-18T00:54:00Z6.982   coyote_creek
2015-08-18T00:24:00Z2.041   santa_monica
2015-08-18T00:30:00Z2.051   santa_monica
2015-08-18T00:42:00Z2.057   santa_monica
2015-08-18T00:00:00Z2.064   santa_monica
2015-08-18T00:06:00Z2.116   santa_monica
2015-08-18T00:12:00Z2.028   santa_monica

该查询返回在2015-08-18T00:00:00Z2015-08-18T00:54:00Z之间的每个24分钟间隔内,field key water_level对应的最小的三个值,并且以递减的时间戳顺序返回结果。

说明

GROUP BY time()子句不会覆盖数据点的原始时间戳。

BOTTOM()的常见问题

问题一:BOTTOM()和GROUP BY time()子句同时使用

对于同时带有BOTTOM()GROUP BY time()子句的查询,将返回每个GROUP BY time()时间间隔的指定个数的数据点。对于大多数GROUP BY time()查询,返回的时间戳表示GROUP BY time()时间间隔的开始时间,但是,带有BOTTOM()函数的GROUP BY time()查询则不一样,它们保留原始数据点的时间戳。

示例以下查询返回每18分钟GROUP BY time()间隔对应的两个数据点。请注意,返回的时间戳是数据点的原始时间戳;它们不会被强制要求必须匹配GROUP BY time()间隔的开始时间。

SELECT BOTTOM("water_level",2) FROM "h2o_feet" WHERE time >='2015-08-18T00:00:00Z' AND time <='2015-08-18T00:30:00Z' AND "location"='santa_monica' GROUP BY time(18m)

name: h2o_feet
time                   bottom
----------
                           __
2015-08-18T00:00:00Z2.064|
2015-08-18T00:12:00Z2.028|<-------Smallest points for the first time interval
--
                           __
2015-08-18T00:24:00Z2.041|
2015-08-18T00:30:00Z2.051|<-------Smallest points for the second time interval
--

问题二:BOTTOM()和具有少于N个tag value的tag key

使用语法SELECT BOTTOM(<field_key>,<tag_key>,<N>)的查询可以返回比预期少的数据点。如果tag key有X个tag value,但是查询指定的是N个tag value,如果X小于N,那么查询将返回X个数据点。

示例以下查询请求的是tag key location的三个tag value对于的water_level的最小值。因为tag key location只有两个tag value(santa_monicacoyote_creek),所以该查询返回两个数据点而不是三个。

SELECT BOTTOM("water_level","location",3) FROM "h2o_feet"

name: h2o_feet
time                   bottom   location
------------------
2015-08-29T10:36:00Z-0.243   santa_monica
2015-08-29T14:30:00Z-0.61    coyote_creek

问题三:BOTTOM()、tag和INTO子句

当使用INTO子句但没有使用GROUP BY tag子句时,大多数InfluxQL函数将原始数据中的tag转换为新写入数据中的field。这种行为同样适用于BOTTOM()函数除非BOTTOM()中包含tag key作为参数:BOTTOM(field_key,tag_key(s),N)。在这些情况下,系统会将指定的tag保留为新写入数据中的tag。

示例:下面代码块中的第一个查询返回tag key location的两个tag value对应的field key water_level的最小值,并且,它这些结果写入measurement bottom_water_levels中。第二个查询展示了TSDB For InfluxDB®将tag location保留为measurement bottom_water_levels中的tag。

> SELECT BOTTOM("water_level","location",2) INTO "bottom_water_levels" FROM "h2o_feet"

name: result
time                 written
-----------
1970-01-01T00:00:00Z2

> SHOW TAG KEYS FROM "bottom_water_levels"

name: bottom_water_levels
tagKey
------
location

FIRST()

返回具有最早时间戳的field value。

语法

SELECT FIRST(<field_key>)[,<tag_key(s)>|<field_key(s)>][INTO_clause] FROM_clause [WHERE_clause][GROUP_BY_clause][ORDER_BY_clause][LIMIT_clause][OFFSET_clause][SLIMIT_clause][SOFFSET_clause]

语法说明

FIRST(field_key):返回field key对应的具有最早时间戳的field value。

FIRST(/regular_expression/):返回与正则表达式匹配的每个field key对应的具有最早时间戳的field value。

FIRST(*):返回在measurement中每个field key对应的具有最早时间戳的field value。

FIRST(field_key),tag_key(s),field_key(s):返回括号中的field key对应的具有最早时间戳的field value,以及相关的tag和/或field。

FIRST():支持所有数据类型的field value。

示例1:选择指定field key对应的具有最早时间戳的field value

SELECT FIRST("level description") FROM "h2o_feet"

name: h2o_feet
time                   first
---------
2015-08-18T00:00:00Z   between 6 and 9 feet

该查询返回measurement h2o_feet中field key level description对应的具有最早时间戳的field value。

示例2:选择measurement中每个field key对应的具有最早时间戳的field value

SELECT FIRST(*) FROM "h2o_feet"

name: h2o_feet
time                   first_level description   first_water_level
--------------------------------------------
1970-01-01T00:00:00Z   between 6 and 9 feet      8.12

该查询返回measurement h2o_feet中每个field key对应的具有最早时间戳的field value。measurement h2o_feet中有两个field key:level descriptionwater_level

示例3:选择与正则表达式匹配的每个field key对应的具有最早时间戳的field value

SELECT FIRST(/level/) FROM "h2o_feet"

name: h2o_feet
time                   first_level description   first_water_level
--------------------------------------------
1970-01-01T00:00:00Z   between 6 and 9 feet      8.12

该查询返回measurement h2o_feet中每个包含单词level的field key对应的具有最早时间戳的field value。

示例4:选择指定field key对应的具有最早时间戳的field value以及相关的tag和field

SELECT FIRST("level description"),"location","water_level" FROM "h2o_feet"

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

该查询返回measurement h2o_feet中field key level description对应的具有最早时间戳的field value,以及相关的tag key location和field key water_level的值。

示例5:选择指定field key对应的具有最早时间戳的field value并包含多个子句

SELECT FIRST("water_level") FROM "h2o_feet" WHERE time >='2015-08-17T23:48:00Z' AND time <='2015-08-18T00:54:00Z' GROUP BY time(12m),* fill(9.01) LIMIT 4 SLIMIT 1

name: h2o_feet
tags: location=coyote_creek
time                   first
---------
2015-08-17T23:48:00Z9.01
2015-08-18T00:00:00Z8.12
2015-08-18T00:12:00Z7.887
2015-08-18T00:24:00Z7.635

该查询返回measurement h2o_feet中field key water_level对应的具有最早时间戳的field value,它涵盖的时间范围在2015-08-17T23:48:00Z2015-08-18T00:54:00Z之间,并将查询结果按12分钟的时间间隔和每个tag进行分组,同时,该查询用9.01填充没有数据的时间间隔,并将返回的数据点个数和序列个数分别限制为4和1。

说明

GROUP BY time()子句会覆盖数据点的原始时间戳。查询结果中的时间戳表示每12分钟时间间隔的开始时间,其中,第一个数据点涵盖的时间间隔在2015-08-17T23:48:00Z2015-08-18T00:00:00Z之间,最后一个数据点涵盖的时间间隔在2015-08-18T00:24:00Z2015-08-18T00:36:00Z之间。

LAST()

返回具有最新时间戳的field value。

语法

SELECT LAST(<field_key>)[,<tag_key(s)>|<field_keys(s)>][INTO_clause] FROM_clause [WHERE_clause][GROUP_BY_clause][ORDER_BY_clause][LIMIT_clause][OFFSET_clause][SLIMIT_clause][SOFFSET_clause]

语法说明

LAST(field_key):返回field key对应的具有最新时间戳的field value。

LAST(/regular_expression/):返回与正则表达式匹配的每个field key对应的具有最新时间戳的field value。

LAST(*):返回在measurement中每个field key对应的具有最新时间戳的field value。

LAST(field_key),tag_key(s),field_key(s):返回括号中的field key对应的具有最新时间戳的field value,以及相关的tag和/或field。

LAST():支持所有数据类型的field value。

示例1:选择指定field key对应的具有最新时间戳的field value

SELECT LAST("level description") FROM "h2o_feet"

name: h2o_feet
time                   last
--------
2015-09-18T21:42:00Z   between 3 and 6 feet

该查询返回measurement h2o_feet中field key level description对应的具有最新时间戳的field value。

示例2:选择measurement中每个field key对应的具有最新时间戳的field value

SELECT LAST(*) FROM "h2o_feet"

name: h2o_feet
time                   last_level description   last_water_level
--------------------------------------------
2015-09-18T21:42:00Z   between 3 and 6 feet      4.938

该查询返回measurement h2o_feet中每个field key对应的具有最新时间戳的field value。measurement h2o_feet中有两个field key:level descriptionwater_level

示例3:选择与正则表达式匹配的每个field key对应的具有最新时间戳的field value

SELECT LAST(/level/) FROM "h2o_feet"

name: h2o_feet
time                   last_level description   last_water_level
--------------------------------------------
2015-09-18T21:42:00Z   between 3 and 6 feet      4.938

该查询返回measurement h2o_feet中每个包含单词level的field key对应的具有最新时间戳的field value。

示例4:选择指定field key对应的具有最新时间戳的field value以及相关的tag和field

SELECT LAST("level description"),"location","water_level" FROM "h2o_feet"

name: h2o_feet
time                  last                  location      water_level
---------------------------
2015-09-18T21:42:00Z  between 3 and 6 feet  santa_monica  4.938

该查询返回measurement h2o_feet中field key level description对应的具有最新时间戳的field value,以及相关的tag key location和field key water_level的值。

示例5:选择指定field key对应的具有最新时间戳的field value并包含多个子句

SELECT LAST("water_level") FROM "h2o_feet" WHERE time >='2015-08-17T23:48:00Z' AND time <='2015-08-18T00:54:00Z' GROUP BY time(12m),* fill(9.01) LIMIT 4 SLIMIT 1

name: h2o_feet
tags: location=coyote_creek
time                   last
--------
2015-08-17T23:48:00Z9.01
2015-08-18T00:00:00Z8.005
2015-08-18T00:12:00Z7.762
2015-08-18T00:24:00Z7.5

该查询返回measurement h2o_feet中field key water_level对应的具有最新时间戳的field value,它涵盖的时间范围在2015-08-17T23:48:00Z2015-08-18T00:54:00Z之间,并将查询结果按12分钟的时间间隔和每个tag进行分组,同时,该查询用9.01填充没有数据的时间间隔,并将返回的数据点个数和序列个数分别限制为4和1。

说明

GROUP BY time()子句会覆盖数据点的原始时间戳。查询结果中的时间戳表示每12分钟时间间隔的开始时间,其中,第一个数据点涵盖的时间间隔在2015-08-17T23:48:00Z2015-08-18T00:00:00Z之间,最后一个数据点涵盖的时间间隔在2015-08-18T00:24:00Z2015-08-18T00:36:00Z之间。

MAX()

返回field value的最大值。

语法

SELECT MAX(<field_key>)[,<tag_key(s)>|<field__key(s)>][INTO_clause] FROM_clause [WHERE_clause][GROUP_BY_clause][ORDER_BY_clause][LIMIT_clause][OFFSET_clause][SLIMIT_clause][SOFFSET_clause]

语法说明

MAX(field_key):返回field key对应的field value的最大值。

MAX(/regular_expression/):返回与正则表达式匹配的每个field key对应的field value的最大值。

MAX(*):返回在measurement中每个field key对应的field value的最大值。

MAX(field_key),tag_key(s),field_key(s):返回括号中的field key对应的field value的最大值,以及相关的tag和/或field。

MAX():支持数据类型为int64和float64的field value。

示例1:选择指定field key对应的field value的最大值

SELECT MAX("water_level") FROM "h2o_feet"

name: h2o_feet
time                   max
-------
2015-08-29T07:24:00Z9.964

该查询返回measurement h2o_feet中field key water_level对应的field value的最大值。

示例2:选择measurement中每个field key对应的field value的最大值

SELECT MAX(*) FROM "h2o_feet"

name: h2o_feet
time                   max_water_level
-------------------
2015-08-29T07:24:00Z9.964

该查询返回measurement h2o_feet中每个存储数值的field key对应的field value的最大值。measurement h2o_feet中只有一个数值类型的field:water_level

示例3:选择与正则表达式匹配的每个field key对应的field value的最大值

SELECT MAX(/water/) FROM "h2o_feet"

name: h2o_feet
time                   max_water_level
-------------------
2015-08-29T07:24:00Z9.964

该查询返回measurement h2o_feet中每个存储数值并包含单词water的field key对应的field value的最大值。

示例4:选择指定field key对应的field value的最大值以及相关的tag和field

SELECT MAX("water_level"),"location","level description" FROM "h2o_feet"

name: h2o_feet
time                  max    location      level description
--------------------------------
2015-08-29T07:24:00Z9.964  coyote_creek  at or greater than 9 feet

该查询返回measurement h2o_feet中field key water_level对应的field value的最大值,以及相关的tag key location和field key level description的值。

示例5:选择指定field key对应的field value的最大值并包含多个子句

SELECT MAX("water_level") FROM "h2o_feet" WHERE time >='2015-08-17T23:48:00Z' AND time <='2015-08-18T00:54:00Z' GROUP BY time(12m),* fill(9.01) LIMIT 4 SLIMIT 1

name: h2o_feet
tags: location=coyote_creek
time                   max
-------
2015-08-17T23:48:00Z9.01
2015-08-18T00:00:00Z8.12
2015-08-18T00:12:00Z7.887
2015-08-18T00:24:00Z7.635

该查询返回measurement h2o_feet中field key water_level对应的field value的最大值,它涵盖的时间范围在2015-08-17T23:48:00Z2015-08-18T00:54:00Z之间,并将查询结果按12分钟的时间间隔和每个tag进行分组,同时,该查询用9.01填充没有数据的时间间隔,并将返回的数据点个数和序列个数分别限制为4和1。

说明

GROUP BY time()子句会覆盖数据点的原始时间戳。查询结果中的时间戳表示每12分钟时间间隔的开始时间,其中,第一个数据点涵盖的时间间隔在2015-08-17T23:48:00Z2015-08-18T00:00:00Z之间,最后一个数据点涵盖的时间间隔在2015-08-18T00:24:00Z2015-08-18T00:36:00Z之间。

MIN()

返回field value的最小值。

语法

SELECT MIN(<field_key>)[,<tag_key(s)>|<field_key(s)>][INTO_clause] FROM_clause [WHERE_clause][GROUP_BY_clause][ORDER_BY_clause][LIMIT_clause][OFFSET_clause][SLIMIT_clause][SOFFSET_clause]

语法说明

MIN(field_key):返回field key对应的field value的最小值。

MIN(/regular_expression/):返回与正则表达式匹配的每个field key对应的field value的最小值。

MIN(*):返回在measurement中每个field key对应的field value的最小值。

MIN(field_key),tag_key(s),field_key(s):返回括号中的field key对应的field value的最小值,以及相关的tag和/或field。

MIN():支持数据类型为int64和float64的field value。

示例1:选择指定field key对应的field value的最小值

SELECT MIN("water_level") FROM "h2o_feet"

name: h2o_feet
time                   min
-------
2015-08-29T14:30:00Z-0.61

该查询返回measurement h2o_feet中field key water_level对应的field value的最小值。

示例2:选择measurement中每个field key对应的field value的最小值

SELECT MIN(*) FROM "h2o_feet"

name: h2o_feet
time                   min_water_level
-------------------
2015-08-29T14:30:00Z-0.61

该查询返回measurement h2o_feet中每个存储数值的field key对应的field value的最小值。measurement h2o_feet中只有一个数值类型的field:water_level

示例3:选择与正则表达式匹配的每个field key对应的field value的最小值

SELECT MIN(/water/) FROM "h2o_feet"

name: h2o_feet
time                   min_water_level
-------------------
2015-08-29T14:30:00Z-0.61

该查询返回measurement h2o_feet中每个存储数值并包含单词water的field key对应的field value的最小值。

示例4:选择指定field key对应的field value的最小值以及相关的tag和field

SELECT MIN("water_level"),"location","level description" FROM "h2o_feet"

name: h2o_feet
time                  min    location      level description
--------------------------------
2015-08-29T14:30:00Z-0.61  coyote_creek  below 3 feet

该查询返回measurement h2o_feet中field key water_level对应的field value的最小值,以及相关的tag key location和field key level description的值。

示例5:选择指定field key对应的field value的最小值并包含多个子句

SELECT MIN("water_level") FROM "h2o_feet" WHERE time >='2015-08-17T23:48:00Z' AND time <='2015-08-18T00:54:00Z' GROUP BY time(12m),* fill(9.01) LIMIT 4 SLIMIT 1

name: h2o_feet
tags: location=coyote_creek
time                   min
-------
2015-08-17T23:48:00Z9.01
2015-08-18T00:00:00Z8.005
2015-08-18T00:12:00Z7.762
2015-08-18T00:24:00Z7.5

该查询返回measurement h2o_feet中field key water_level对应的field value的最小值,它涵盖的时间范围在2015-08-17T23:48:00Z2015-08-18T00:54:00Z之间,并将查询结果按12分钟的时间间隔和每个tag进行分组,同时,该查询用9.01填充没有数据的时间间隔,并将返回的数据点个数和序列个数分别限制为4和1。

说明

GROUP BY time()子句会覆盖数据点的原始时间戳。查询结果中的时间戳表示每12分钟时间间隔的开始时间,其中,第一个数据点涵盖的时间间隔在2015-08-17T23:48:00Z2015-08-18T00:00:00Z之间,最后一个数据点涵盖的时间间隔在2015-08-18T00:24:00Z2015-08-18T00:36:00Z之间。

PERCENTILE()

返回第N个百分位数的field value。

语法

SELECT PERCENTILE(<field_key>,<N>)[,<tag_key(s)>|<field_key(s)>][INTO_clause] FROM_clause [WHERE_clause][GROUP_BY_clause][ORDER_BY_clause][LIMIT_clause][OFFSET_clause][SLIMIT_clause][SOFFSET_clause]

语法说明

PERCENTILE(field_key,N):返回指定field key对应的第N个百分位数的field value。

PERCENTILE(/regular_expression/,N):返回与正则表达式匹配的每个field key对应的第N个百分位数的field value。

PERCENTILE(*,N):返回在measurement中每个field key对应的第N个百分位数的field value。

PERCENTILE(field_key,N),tag_key(s),field_key(s):返回括号中的field key对应的第N个百分位数的field value,以及相关的tag和/或field。N必须是0到100之间的整数或浮点数。PERCENTILE()支持数据类型为int64和float64的field value。

示例1:选择指定field key对应的第五个百分位数的field value

SELECT PERCENTILE("water_level",5) FROM "h2o_feet"

name: h2o_feet
time                   percentile
--------------
2015-08-31T03:42:00Z1.122

该查询返回的field value大于measurement h2o_feet中field key water_level对应的所有field value中的百分之五。

示例2:选择measurement中每个field key对应的第五个百分位数的field value

SELECT PERCENTILE(*,5) FROM "h2o_feet"

name: h2o_feet
time                   percentile_water_level
--------------------------
2015-08-31T03:42:00Z1.122

该查询返回的field value大于measurement h2o_feet中每个存储数值的field key对应的所有field value中的百分之五。measurement h2o_feet中只有一个数值类型的field:water_level

示例3:选择与正则表达式匹配的每个field key对应的第五个百分位数的field value

SELECT PERCENTILE(/water/,5) FROM "h2o_feet"

name: h2o_feet
time                   percentile_water_level
--------------------------
2015-08-31T03:42:00Z1.122

该查询返回的field value大于measurement h2o_feet中每个存储数值并包含单词water的field key对应的所有field value中的百分之五。

示例4:选择指定field key对应的第五个百分位数的field value以及相关的tag和field

SELECT PERCENTILE("water_level",5),"location","level description" FROM "h2o_feet"

name: h2o_feet
time                  percentile  location      level description
---------------------------------------
2015-08-31T03:42:00Z1.122       coyote_creek  below 3 feet

该查询返回的field value大于measurement h2o_feet中field key water_level对应的所有field value中的百分之五,以及相关的tag key location和field key level description的值。

示例五:选择指定field key对应的第20个百分位数的field value并包含多个子句

SELECT PERCENTILE("water_level",20) FROM "h2o_feet" WHERE time >='2015-08-17T23:48:00Z' AND time <='2015-08-18T00:54:00Z' GROUP BY time(24m) fill(15) LIMIT 2

name: h2o_feet
time                   percentile
--------------
2015-08-17T23:36:00Z15
2015-08-18T00:00:00Z2.064

该查询返回的field value大于measurement h2o_feet中field key water_level对应的所有field value中的百分之二十,它涵盖的时间范围在2015-08-17T23:48:00Z2015-08-18T00:54:00Z之间,并将查询结果按24分钟的时间间隔进行分组,同时,该查询用15填充没有数据的时间间隔,并将返回的数据点个数限制为2。

说明

GROUP BY time()子句会覆盖数据点的原始时间戳。查询结果中的时间戳表示每24分钟时间间隔的开始时间,其中,第一个数据点涵盖的时间间隔在2015-08-17T23:36:00Z2015-08-18T00:00:00Z之间,最后一个数据点涵盖的时间间隔在2015-08-18T00:00:00Z2015-08-18T00:24:00Z之间。

PERCENTILE()的常见问题

问题一:PERCENTILE()与其它InfluxQL函数进行对比

  • PERCENTILE(<field_key>,100)相当于MAX(<field_key>)

  • PERCENTILE(<field_key>, 50)近似于MEDIAN(<field_key>),除非field key包含的field value有偶数个,那么这时候MEDIAN()将返回两个中间值的平均数。

  • PERCENTILE(<field_key>,0)不等于MIN(<field_key>)PERCENTILE(<field_key>,0)会返回null

SAMPLE()

返回包含N个field value的随机样本。SAMPLE()使用reservoir sampling来生成随机数据点。

语法

SELECT SAMPLE(<field_key>,<N>)[,<tag_key(s)>|<field_key(s)>][INTO_clause] FROM_clause [WHERE_clause][GROUP_BY_clause][ORDER_BY_clause][LIMIT_clause][OFFSET_clause][SLIMIT_clause][SOFFSET_clause]

语法说明

SAMPLE(field_key,N):返回指定field key对应的N个随机选择的field value。

SAMPLE(/regular_expression/,N):返回与正则表达式匹配的每个field key对应的N个随机选择的field value。

SAMPLE(*,N):返回在measurement中每个field key对应的N个随机选择的field value。

SAMPLE(field_key,N),tag_key(s),field_key(s):返回括号中的field key对应的N个随机选择的field value,以及相关的tag和/或field。N必须是整数。SAMPLE()支持所有数据类型的field value。

示例1:选择指定field key对应的field value的随机样本

SELECT SAMPLE("water_level",2) FROM "h2o_feet"

name: h2o_feet
time                   sample
----------
2015-09-09T21:48:00Z5.659
2015-09-18T10:00:00Z6.939

该查询返回measurement h2o_feet中field key water_level对应的两个随机选择的数据点。

示例2:选择measurement中每个field key对应的field value的随机样本

SELECT SAMPLE(*,2) FROM "h2o_feet"

name: h2o_feet
time                   sample_level description   sample_water_level
----------------------------------------------
2015-08-25T17:06:00Z3.284
2015-09-03T04:30:00Z   below 3 feet
2015-09-03T20:06:00Z   between 3 and 6 feet
2015-09-08T21:54:00Z3.412

该查询返回measurement h2o_feet中每个field key对应的两个随机选择的数据点。measurement h2o_feet中有两个field key:level descriptionwater_level

示例3:选择与正则表达式匹配的每个field key对应的field value的随机样本

SELECT SAMPLE(/level/,2) FROM "h2o_feet"

name: h2o_feet
time                   sample_level description   sample_water_level
----------------------------------------------
2015-08-30T05:54:00Z   between 6 and 9 feet
2015-09-07T01:18:00Z7.854
2015-09-09T20:30:00Z7.32
2015-09-13T19:18:00Z   between 3 and 6 feet

该查询返回measurement h2o_feet中每个包含单词level的field key对应的两个随机选择的数据点。

示例4:选择指定field key对应的field value的随机样本以及相关的tag和field

SELECT SAMPLE("water_level",2),"location","level description" FROM "h2o_feet"

name: h2o_feet
time                  sample  location      level description
-----------------------------------
2015-08-29T10:54:00Z5.689   coyote_creek  between 3 and 6 feet
2015-09-08T15:48:00Z6.391   coyote_creek  between 6 and 9 feet

该查询返回measurement h2o_feet中field key water_level对应的两个随机选择的数据点,以及相关的tag key location和field key level description的值。

示例5:选择指定field key对应field value的随机样本并包含多个子句

SELECT SAMPLE("water_level",1) FROM "h2o_feet" WHERE time >='2015-08-18T00:00:00Z' AND time <='2015-08-18T00:30:00Z' AND "location"='santa_monica' GROUP BY time(18m)

name: h2o_feet
time                   sample
----------
2015-08-18T00:12:00Z2.028
2015-08-18T00:30:00Z2.051

该查询返回measurement h2o_feet中field key water_level对应的一个随机选择的数据点,它涵盖的时间范围在2015-08-18T00:00:00Z2015-08-18T00:30:00Z之间,并将查询结果按18分钟的时间间隔进行分组。

说明

GROUP BY time()子句不会覆盖数据点的原始时间戳。

SAMPLE()的常见问题

问题一:SAMPLE()和GROUP BY time()子句同时使用

对于同时带有SAMPLE()GROUP BY time()子句的查询,将返回每个GROUP BY time()时间间隔的指定个数(N)的数据点。对于大多数GROUP BY time()查询,返回的时间戳表示GROUP BY time()时间间隔的开始时间,但是,带有SAMPLE()函数的GROUP BY time()查询则不一样,它们保留原始数据点的时间戳。

示例:以下查询返回每18分钟GROUP BY time()间隔对应的两个随机选择的数据点。请注意,返回的时间戳是数据点的原始时间戳;它们不会被强制要求必须匹配GROUP BY time()间隔的开始时间。

SELECT SAMPLE("water_level",2) FROM "h2o_feet" WHERE time >='2015-08-18T00:00:00Z' AND time <='2015-08-18T00:30:00Z' AND "location"='santa_monica' GROUP BY time(18m)

name: h2o_feet
time                   sample
----------
                           __
2015-08-18T00:06:00Z2.116|
2015-08-18T00:12:00Z2.028|<-------Randomly-selected points for the first time interval
--
                           __
2015-08-18T00:18:00Z2.126|
2015-08-18T00:30:00Z2.051|<-------Randomly-selected points for the second time interval
--

TOP()

返回最大的N个field value。

语法

SELECT TOP(<field_key>[,<tag_key(s)>],<N>)[,<tag_key(s)>|<field_key(s)>][INTO_clause] FROM_clause [WHERE_clause][GROUP_BY_clause][ORDER_BY_clause][LIMIT_clause][OFFSET_clause][SLIMIT_clause][SOFFSET_clause]

语法说明

TOP(field_key,N):返回field key对应的最大的N个值。

TOP(field_key,tag_key(s),N):返回tag key的N个tag value对应的field key的最大值。

TOP(field_key,N),tag_key(s),field_key(s):返回括号中的field key对应的最大的N个值,以及相关的tag和/或field。

TOP():支持数据类型为int64和float64的field value。

说明

如果最大值有两个或多个并且它们之间有关联,TOP()返回具有最早时间戳的field value。 当TOP()函数与INTO子句一起使用时,TOP()与其它InfluxQL函数不同。

示例1:选择指定field key对应的最大的三个值

SELECT TOP("water_level",3) FROM "h2o_feet"

name: h2o_feet
time                   top
-------
2015-08-29T07:18:00Z9.957
2015-08-29T07:24:00Z9.964
2015-08-29T07:30:00Z9.954

该查询返回measurement h2o_feet中field key water_level对应的最大的三个值。

示例2:选择两个tag对应的field key的最大值

SELECT TOP("water_level","location",2) FROM "h2o_feet"

name: h2o_feet
time                   top     location
---------------
2015-08-29T03:54:00Z7.205   santa_monica
2015-08-29T07:24:00Z9.964   coyote_creek

该查询返回tag key location的两个tag value对应的field key water_level的最大值。

示例3:选择指定field key对应的最大的四个值以及相关的tag和field

SELECT TOP("water_level",4),"location","level description" FROM "h2o_feet"

name: h2o_feet
time                  top    location      level description
--------------------------------
2015-08-29T07:18:00Z9.957  coyote_creek  at or greater than 9 feet
2015-08-29T07:24:00Z9.964  coyote_creek  at or greater than 9 feet
2015-08-29T07:30:00Z9.954  coyote_creek  at or greater than 9 feet
2015-08-29T07:36:00Z9.941  coyote_creek  at or greater than 9 feet

该查询返回field key water_level对应的最大的四个值,以及相关的tag key location和field key level description的值。

示例4:选择指定field key对应的最大的三个值并包含多个子句

SELECT TOP("water_level",3),"location" FROM "h2o_feet" WHERE time >='2015-08-18T00:00:00Z' AND time <='2015-08-18T00:54:00Z' GROUP BY time(24m) ORDER BY time DESC

name: h2o_feet
time                  top    location
---------------
2015-08-18T00:48:00Z7.11   coyote_creek
2015-08-18T00:54:00Z6.982  coyote_creek
2015-08-18T00:54:00Z2.054  santa_monica
2015-08-18T00:24:00Z7.635  coyote_creek
2015-08-18T00:30:00Z7.5    coyote_creek
2015-08-18T00:36:00Z7.372  coyote_creek
2015-08-18T00:00:00Z8.12   coyote_creek
2015-08-18T00:06:00Z8.005  coyote_creek
2015-08-18T00:12:00Z7.887  coyote_creek

该查询返回在2015-08-18T00:00:00Z2015-08-18T00:54:00Z之间的每个24分钟间隔内,field key water_level对应的最大的三个值,并且以递减的时间戳顺序返回结果。

说明

GROUP BY time()子句不会覆盖数据点的原始时间戳。

TOP()的常见问题

问题1:TOP()和GROUP BY time()子句同时使用

对于同时带有TOP()GROUP BY time()子句的查询,将返回每个GROUP BY time()时间间隔的指定个数的数据点。对于大多数GROUP BY time()查询,返回的时间戳表示GROUP BY time()时间间隔的开始时间,但是,带有TOP()函数的GROUP BY time()查询则不一样,它们保留原始数据点的时间戳。

示例:以下查询返回每18分钟GROUP BY time()间隔对应的两个数据点。请注意,返回的时间戳是数据点的原始时间戳;它们不会被强制要求必须匹配GROUP BY time()间隔的开始时间。

SELECT TOP("water_level",2) FROM "h2o_feet" WHERE time >='2015-08-18T00:00:00Z' AND time <='2015-08-18T00:30:00Z' AND "location"='santa_monica' GROUP BY time(18m)

name: h2o_feet
time                   top
----------
                           __
2015-08-18T00:00:00Z2.064|
2015-08-18T00:06:00Z2.116|<-------Greatest points for the first time interval
--
                           __
2015-08-18T00:18:00Z2.126|
2015-08-18T00:30:00Z2.051|<-------Greatest points for the second time interval
--

问题2:TOP()和具有少于N个tag value的tag key

使用语法SELECT TOP(<field_key>,<tag_key>,<N>)的查询可以返回比预期少的数据点。如果tag key有X个tag value,但是查询指定的是N个tag value,如果X小于N,那么查询将返回X个数据点。

示例:以下查询请求的是tag key location的三个tag value对于的water_level的最大值。因为tag key location只有两个tag value(santa_monicacoyote_creek),所以该查询返回两个数据点而不是三个。

> SELECT TOP("water_level","location",3) FROM "h2o_feet"

name: h2o_feet
time                  top    location
---------------
2015-08-29T03:54:00Z7.205  santa_monica
2015-08-29T07:24:00Z9.964  coyote_creek

问题3:TOP()、tag和INTO子句

当使用INTO子句但没有使用GROUP BY tag子句时,大多数InfluxQL函数将原始数据中的tag转换为新写入数据中的field。这种行为同样适用于TOP()函数,除非TOP()中包含tag key作为参数:TOP(field_key,tag_key(s),N)。在这些情况下,系统会将指定的tag保留为新写入数据中的tag。

示例:下面代码块中的第一个查询返回tag key location的两个tag value对应的field key water_level的最大值,并且,它这些结果写入measurement top_water_levels中。第二个查询展示了TSDB For InfluxDB®将tag location保留为measurement top_water_levels中的tag。

SELECT TOP("water_level","location",2) INTO "top_water_levels" FROM "h2o_feet"

name: result
time                 written
-----------
1970-01-01T00:00:00Z2

> SHOW TAG KEYS FROM "top_water_levels"

name: top_water_levels
tagKey
------
location