InfluxDb中的函数二
BOTTOM()
的常见问题
问题一:BOTTOM()
和GROUP BY time()
子句
BOTTOM()
和GROUP BY time()
子句的查询返回每个GROUP BY time()
间隔指定的点数。对于大多数GROUP BY time()
查询,返回的时间戳记标记GROUP BY time()
间隔的开始。GROUP BY time()
查询与BOTTOM()
函数的行为不同; 它们保留原始数据点的时间戳。
例如
下面的查询返回每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:00Z 2.064 | 2015-08-18T00:12:00Z 2.028 | <------- Smallest points for the first time interval -- __ 2015-08-18T00:24:00Z 2.041 | 2015-08-18T00:30:00Z 2.051 | <------- Smallest points for the second time interval --
问题二:BOTTOM()
和一个少于N个值得tag key
使用语法SELECT BOTTOM(<field_key>,<tag_key>,<N>)
的查询可以返回比预期少的点。如果tag具有X标签值,则查询指定N个值,当X小于N,则查询返回X点。
例如
下面的查询将要求taglocation
的三个值的water_level
的最小字段值。由于location
具有两个值(santa_monica
和coyote_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()
,tags和INTO
子句
当与INTO
子句和GROUP BY tag
子句结合使用时,大多数InfluxQL函数将初始数据中的任何tag转换为新写入的数据中的field。此行为也适用于BOTTOM()
函数,除非BOTTOM()
包含一个tag key作为参数:BOTTOM(field_key,tag_key(s),N)
。在这些情况下,系统将指定的tag作为新写入的数据中的tag。
例如
下面的代码块中的第一个查询返回与tag location
相关联的两个tag value的fieldwater_level
中最小的字段值。它也将这些结果写入measurementbottom_water_levels
。 第二个查询显示InfluxDB在bottom_water_levels
中将location
保存为tag。
> SELECT BOTTOM("water_level","location",2) INTO "bottom_water_levels" FROM "h2o_feet" name: result time written ---- ------- 1970-01-01T00:00:00Z 2 > SHOW TAG KEYS FROM "bottom_water_levels" name: bottom_water_levels tagKey ------ location
FIRST()
返回时间戳最早的值
语法
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时间戳最早的值。
FIRST(/regular_expression/)
返回满足正则表达式的每个field key的时间戳最早的值。
FIRST(*)
返回measurement中每个field key的时间戳最早的值。
FIRST(field_key),tag_key(s),field_key(s)
返回括号里的字段的时间戳最早的值,以及相关联的tag或field,或者两者都有。
FIRST()
支持所有类型的field。
例子
例一:返回field key时间戳最早的值
> SELECT FIRST("level description") FROM "h2o_feet" name: h2o_feet time first ---- ----- 2015-08-18T00:00:00Z between 6 and 9 feet
查询返回level description
的时间戳最早的值。
例二:列出一个measurement中每个field key的时间戳最早的值
> 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
查询返回h2o_feet
中每个字段的时间戳最早的值。h2o_feet
有两个字段:level description
和water_level
。
例三:列出匹配正则表达式的field的时间戳最早的值
> 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
查询返回h2o_feet
中含有level
的字段的时间戳最早的值。
例四:返回field的最早的值,以及其相关的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
查询返回level description
的时间戳最早的值,以及其相关的taglocation
和fieldwater_level
。
例五:列出包含多个子句的field key的时间戳最早的值
> 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:00Z 9.01 2015-08-18T00:00:00Z 8.12 2015-08-18T00:12:00Z 7.887 2015-08-18T00:24:00Z 7.635
查询返回字段water_level
中最早的字段值。它涵盖2015-08-17T23:48:00Z
和2015-08-18T00:54:00Z
之间的时间段,并将结果按12分钟的时间间隔和每个tag分组。查询用9.01
填充空时间间隔,并将点数和measurement限制到4和1。
请注意,GROUP BY time()
子句覆盖点的原始时间戳。结果中的时间戳表示每12分钟时间间隔的开始; 结果的第一点涵盖2015-08-17T23:48:00Z
和2015-08-18T00:00:00Z
之间的时间间隔,结果的最后一点涵盖2015-08-18T00:24:00Z
和2015-08-18T00:36:00Z
之间的间隔。
LAST()
返回时间戳最近的值
语法
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时间戳最近的值。
LAST(/regular_expression/)
返回满足正则表达式的每个field key的时间戳最近的值。
LAST(*)
返回measurement中每个field key的时间戳最近的值。
LAST(field_key),tag_key(s),field_key(s)
返回括号里的字段的时间戳最近的值,以及相关联的tag或field,或者两者都有。
LAST()
支持所有类型的field。
例子
例一:返回field key时间戳最近的值
> SELECT LAST("level description") FROM "h2o_feet" name: h2o_feet time last ---- ---- 2015-09-18T21:42:00Z between 3 and 6 feet
查询返回level description
的时间戳最近的值。
例二:列出一个measurement中每个field key的时间戳最近的值
> SELECT LAST(*) FROM "h2o_feet" name: h2o_feet time first_level description first_water_level ---- ----------------------- ----------------- 1970-01-01T00:00:00Z between 3 and 6 feet 4.938
查询返回h2o_feet
中每个字段的时间戳最近的值。h2o_feet
有两个字段:level description
和water_level
。
例三:列出匹配正则表达式的field的时间戳最近的值
> SELECT LAST(/level/) FROM "h2o_feet" name: h2o_feet time first_level description first_water_level ---- ----------------------- ----------------- 1970-01-01T00:00:00Z between 3 and 6 feet 4.938
查询返回h2o_feet
中含有level
的字段的时间戳最近的值。
例四:返回field的最近的值,以及其相关的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
查询返回level description
的时间戳最近的值,以及其相关的taglocation
和fieldwater_level
。
例五:列出包含多个子句的field key的时间戳最近的值
> 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:00Z 9.01 2015-08-18T00:00:00Z 8.005 2015-08-18T00:12:00Z 7.762 2015-08-18T00:24:00Z 7.5
查询返回字段water_level
中最近的字段值。它涵盖2015-08-17T23:48:00Z
和2015-08-18T00:54:00Z
之间的时间段,并将结果按12分钟的时间间隔和每个tag分组。查询用9.01
填充空时间间隔,并将点数和measurement限制到4和1。
请注意,GROUP BY time()
子句覆盖点的原始时间戳。结果中的时间戳表示每12分钟时间间隔的开始; 结果的第一点涵盖2015-08-17T23:48:00Z
和2015-08-18T00:00:00Z
之间的时间间隔,结果的最后一点涵盖2015-08-18T00:24:00Z
和2015-08-18T00:36:00Z
之间的间隔。
MAX()
返回最大的字段值
语法
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的最大值。
MAX(/regular_expression/)
返回满足正则表达式的每个field key的最大值。
MAX(*)
返回measurement中每个field key的最大值。
MAX(field_key),tag_key(s),field_key(s)
返回括号里的字段的最大值,以及相关联的tag或field,或者两者都有。
MAX()
支持所有数值类型的field。
例子
例一:返回field key的最大值
> SELECT MAX("water_level") FROM "h2o_feet" name: h2o_feet time max ---- --- 2015-08-29T07:24:00Z 9.964
查询返回water_level
的最大值。
例二:列出一个measurement中每个field key的最大值
> SELECT MAX(*) FROM "h2o_feet" name: h2o_feet time max_water_level ---- --------------- 2015-08-29T07:24:00Z 9.964
查询返回h2o_feet
中每个字段的最大值。h2o_feet
有一个数值类型的字段:water_level
。
例三:列出匹配正则表达式的field的最大值
> SELECT MAX(/level/) FROM "h2o_feet" name: h2o_feet time max_water_level ---- --------------- 2015-08-29T07:24:00Z 9.964
查询返回h2o_feet
中含有level
的数值字段的最大值。
例四:返回field的最大值,以及其相关的tag和field
> SELECT MAX("water_level"),"location","level description" FROM "h2o_feet" name: h2o_feet time max location level description ---- --- -------- ----------------- 2015-08-29T07:24:00Z 9.964 coyote_creek at or greater than 9 feet
查询返回water_level
的最大值,以及其相关的taglocation
和fieldlevel description
。
例五:列出包含多个子句的field key的最大值
> 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:00Z 9.01 2015-08-18T00:00:00Z 8.12 2015-08-18T00:12:00Z 7.887 2015-08-18T00:24:00Z 7.635
查询返回字段water_level
的最大值。它涵盖2015-08-17T23:48:00Z
和2015-08-18T00:54:00Z
之间的时间段,并将结果按12分钟的时间间隔和每个tag分组。查询用9.01
填充空时间间隔,并将点数和measurement限制到4和1。
请注意,GROUP BY time()
子句覆盖点的原始时间戳。结果中的时间戳表示每12分钟时间间隔的开始; 结果的第一点涵盖2015-08-17T23:48:00Z
和2015-08-18T00:00:00Z
之间的时间间隔,结果的最后一点涵盖2015-08-18T00:24:00Z
和2015-08-18T00:36:00Z
之间的间隔。
MIN()
返回最小的字段值
语法
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的最小值。
MIN(/regular_expression/)
返回满足正则表达式的每个field key的最小值。
MIN(*)
返回measurement中每个field key的最小值。
MIN(field_key),tag_key(s),field_key(s)
返回括号里的字段的最小值,以及相关联的tag或field,或者两者都有。
MIN()
支持所有数值类型的field。
例子
例一:返回field key的最小值
> SELECT MIN("water_level") FROM "h2o_feet" name: h2o_feet time min ---- --- 2015-08-29T14:30:00Z -0.61
查询返回water_level
的最小值。
例二:列出一个measurement中每个field key的最小值
> SELECT MIN(*) FROM "h2o_feet" name: h2o_feet time min_water_level ---- --------------- 2015-08-29T14:30:00Z -0.61
查询返回h2o_feet
中每个字段的最小值。h2o_feet
有一个数值类型的字段:water_level
。
例三:列出匹配正则表达式的field的最小值
> SELECT MIN(/level/) FROM "h2o_feet" name: h2o_feet time min_water_level ---- --------------- 2015-08-29T14:30:00Z -0.61
查询返回h2o_feet
中含有level
的数值字段的最小值。
例四:返回field的最小值,以及其相关的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
查询返回water_level
的最小值,以及其相关的taglocation
和fieldlevel description
。
例五:列出包含多个子句的field key的最小值
> 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:00Z 9.01 2015-08-18T00:00:00Z 8.005 2015-08-18T00:12:00Z 7.762 2015-08-18T00:24:00Z 7.5
查询返回字段water_level
的最小值。它涵盖2015-08-17T23:48:00Z
和2015-08-18T00:54:00Z
之间的时间段,并将结果按12分钟的时间间隔和每个tag分组。查询用9.01
填充空时间间隔,并将点数和measurement限制到4和1。
请注意,GROUP BY time()
子句覆盖点的原始时间戳。结果中的时间戳表示每12分钟时间间隔的开始; 结果的第一点涵盖2015-08-17T23:48:00Z
和2015-08-18T00:00:00Z
之间的时间间隔,结果的最后一点涵盖2015-08-18T00:24:00Z
和2015-08-18T00:36:00Z
之间的间隔。
PERCENTILE()
返回较大百分之N的字段值
语法
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的值。
PERCENTILE(/regular_expression/,N)
返回满足正则表达式的每个field key较大的百分之N的值。
PERCENTILE(*,N)
返回measurement中每个field key较大的百分之N的值。
PERCENTILE(field_key,N),tag_key(s),field_key(s)
返回括号里的字段较大的百分之N的值,以及相关联的tag或field,或者两者都有。
N
必须是0到100的整数或者浮点数。
PERCENTILE()
支持所有数值类型的field。
例子
例一:返回field key较大的百分之5的值
> SELECT PERCENTILE("water_level",5) FROM "h2o_feet" name: h2o_feet time percentile ---- ---------- 2015-08-31T03:42:00Z 1.122
查询返回water_level
中值在总的field value中比较大的百分之五。
例二:列出一个measurement中每个field key较大的百分之5的值
> SELECT PERCENTILE(*,5) FROM "h2o_feet" name: h2o_feet time percentile_water_level ---- ---------------------- 2015-08-31T03:42:00Z 1.122
查询返回h2o_feet
中每个字段中值在总的field value中比较大的百分之五。h2o_feet
有一个数值类型的字段:water_level
。
例三:列出匹配正则表达式的field较大的百分之5的值
> SELECT PERCENTILE(/level/,5) FROM "h2o_feet" name: h2o_feet time percentile_water_level ---- ---------------------- 2015-08-31T03:42:00Z 1.122
查询返回h2o_feet
中含有water
的数值字段的较大的百分之5的值。
例四:返回field较大的百分之5的值,以及其相关的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:00Z 1.122 coyote_creek below 3 feet
查询返回water_level
的较大的百分之5的值,以及其相关的taglocation
和fieldlevel description
。
例五:列出包含多个子句的field key的较大的百分之20的值
> 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:00Z 15 2015-08-18T00:00:00Z 2.064
查询返回字段water_level
较大的百分之20的值。它涵盖2015-08-17T23:48:00Z
和2015-08-18T00:54:00Z
之间的时间段,并将结果按24分钟的时间间隔分组。查询用15
填充空时间间隔,并将点数限制到2。
请注意,GROUP BY time()
子句覆盖点的原始时间戳。结果中的时间戳表示每24分钟时间间隔的开始; 结果的第一点涵盖2015-08-17T23:36:00Z
和2015-08-18T00:00:00Z
之间的时间间隔,结果的最后一点涵盖2015-08-18T00:00:00Z
和2015-08-18T00:24:00Z
之间的间隔。
PERCENTILE()的常见问题
问题一:PERCENTILE()和其他函数的比较
PERCENTILE(<field_key>,100)
相当于MAX(<field_key>)
。PERCENTILE(<field_key>,50)
几乎等于MEDIAN(<field_key>)
,除了如果字段键包含偶数个字段值,MEDIAN()
函数返回两个中间值的平均值.PERCENTILE(<field_key>,0)
相当于MIN(<field_key>)
SAMPLE()
返回N
个随机抽样的字段值。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个随机抽样的字段值。
SAMPLE(/regular_expression/,N)
返回满足正则表达式的每个field key的N个随机抽样的字段值。
SAMPLE(*,N)
返回measurement中每个field key的N个随机抽样的字段值。
SAMPLE(field_key,N),tag_key(s),field_key(s)
返回括号里的字段的N个随机抽样的字段值,以及相关联的tag或field,或者两者都有。
N
必须是整数。
SAMPLE()
支持所有类型的field。
例子
例一:返回field key的两个随机抽样的字段值
> SELECT SAMPLE("water_level",2) FROM "h2o_feet" name: h2o_feet time sample ---- ------ 2015-09-09T21:48:00Z 5.659 2015-09-18T10:00:00Z 6.939
查询返回water_level
的两个随机抽样的字段值。
例二:列出一个measurement中每个field key的两个随机抽样的字段值
> SELECT SAMPLE(*,2) FROM "h2o_feet" name: h2o_feet time sample_level description sample_water_level ---- ------------------------ ------------------ 2015-08-25T17:06:00Z 3.284 2015-09-03T04:30:00Z below 3 feet 2015-09-03T20:06:00Z between 3 and 6 feet 2015-09-08T21:54:00Z 3.412
查询返回h2o_feet
中每个字段的两个随机抽样的字段值。h2o_feet
有两个字段:water_level
和level description
。
例三:列出匹配正则表达式的field的两个随机抽样的字段值
> 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:00Z 7.854 2015-09-09T20:30:00Z 7.32 2015-09-13T19:18:00Z between 3 and 6 feet
查询返回h2o_feet
中含有level
的字段的两个随机抽样的字段值。
例四:返回field两个随机抽样的字段值,以及其相关的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:00Z 5.689 coyote_creek between 3 and 6 feet 2015-09-08T15:48:00Z 6.391 coyote_creek between 6 and 9 feet
查询返回water_level
的两个随机抽样的字段值,以及其相关的taglocation
和fieldlevel description
。
例五:列出包含多个子句的field key的一个随机抽样的字段值
> 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:00Z 2.028 2015-08-18T00:30:00Z 2.051
查询返回字段water_level
的一个随机抽样的字段值。它涵盖2015-08-18T00:00:00Z
和2015-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()
间隔的开始。GROUP BY time()
查询与SAMPLE()
函数的行为不同; 它们保留原始数据点的时间戳。
例如
下面的查询每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:00Z 2.116 | 2015-08-18T00:12:00Z 2.028 | <------- Randomly-selected points for the first time interval -- __ 2015-08-18T00:18:00Z 2.126 | 2015-08-18T00:30:00Z 2.051 | <------- Randomly-selected points for the second time interval
TOP()
返回最大的N个field值。
语法
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个field value。
TOP(field_key,tag_key(s),N)
返回某个tag key的N个tag value的最大的field value。
TOP(field_key,N),tag_key(s),field_key(s)
返回括号里的字段的最大N个field value,以及相关的tag或field,或者两者都有。
TOP()
支持所有的数值类型的field。
说明:
- 如果一个field有两个或多个相等的field value,
TOP()
返回时间戳最早的那个。TOP()
和INTO
子句一起使用的时候,和其他的函数有些不一样。
例子
例一:选择一个field的最大的三个值
> SELECT TOP("water_level",3) FROM "h2o_feet" name: h2o_feet time top ---- --- 2015-08-29T07:18:00Z 9.957 2015-08-29T07:24:00Z 9.964 2015-08-29T07:30:00Z 9.954
该查询返回measurementh2o_feet
的字段water_level
的最大的三个值。
例二:选择一个field的两个tag的分别最大的值
> SELECT TOP("water_level","location",2) FROM "h2o_feet" name: h2o_feet time top location ---- --- -------- 2015-08-29T03:54:00Z 7.205 santa_monica 2015-08-29T07:24:00Z 9.964 coyote_creek
该查询返回和taglocation
相关的两个tag值的字段water_level
的分别最大值。
例三:选择一个field的最大的四个值,以及其关联的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:00Z 9.957 coyote_creek at or greater than 9 feet 2015-08-29T07:24:00Z 9.964 coyote_creek at or greater than 9 feet 2015-08-29T07:30:00Z 9.954 coyote_creek at or greater than 9 feet 2015-08-29T07:36:00Z 9.941 coyote_creek at or greater than 9 feet
查询返回water_level
中最大的四个字段值以及taglocation
和fieldlevel description
的相关值。
例四:选择一个field的最大的三个值,并且包括了多个子句
> 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:00Z 7.11 coyote_creek 2015-08-18T00:54:00Z 6.982 coyote_creek 2015-08-18T00:54:00Z 2.054 santa_monica 2015-08-18T00:24:00Z 7.635 coyote_creek 2015-08-18T00:30:00Z 7.5 coyote_creek 2015-08-18T00:36:00Z 7.372 coyote_creek 2015-08-18T00:00:00Z 8.12 coyote_creek 2015-08-18T00:06:00Z 8.005 coyote_creek 2015-08-18T00:12:00Z 7.887 coyote_creek
查询将返回在2015-08-18T00:00:00Z
和2015-08-18T00:54:00Z
之间的每24分钟间隔内,water_level
最大的三个值。它还以降序的时间戳顺序返回结果。
请注意,GROUP BY time()
子句不会覆盖点的原始时间戳。有关该行为的更详细解释,请参阅下面的问题一。
TOP()
的常见问题
问题一:TOP()
和GROUP BY time()
子句
TOP()
和GROUP BY time()
子句的查询返回每个GROUP BY time()
间隔指定的点数。对于大多数GROUP BY time()
查询,返回的时间戳被置为GROUP BY time()
间隔的开始。GROUP BY time()
查询与TOP()
函数的行为不同; 它们保留原始数据点的时间戳。
例如
下面的查询返回每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:00Z 2.064 | 2015-08-18T00:06:00Z 2.116 | <------- Greatest points for the first time interval -- __ 2015-08-18T00:18:00Z 2.126 | 2015-08-18T00:30:00Z 2.051 | <------- Greatest points for the second time interval --
问题二:TOP()
和一个少于N个值得tag key
使用语法SELECT TOP(<field_key>,<tag_key>,<N>)
的查询可以返回比预期少的点。如果tag具有X标签值,则查询指定N个值,当X小于N,则查询返回X点。
例如
下面的查询将要求taglocation
的三个值的water_level
的最大字段值。由于location
具有两个值(santa_monica
和coyote_creek
),所以查询返回两点而不是三个。
> SELECT TOP("water_level","location",3) FROM "h2o_feet" name: h2o_feet time top location ---- --- -------- 2015-08-29T03:54:00Z 7.205 santa_monica 2015-08-29T07:24:00Z 9.964 coyote_creek
问题三:TOP()
,tags和INTO
子句
当与INTO
子句和GROUP BY tag
子句结合使用时,大多数InfluxQL函数将初始数据中的任何tag转换为新写入的数据中的field。此行为也适用于TOP()
函数,除非TOP()
包含一个tag key作为参数:TOP(field_key,tag_key(s),N)
。在这些情况下,系统将指定的tag作为新写入的数据中的tag。
例如
下面的代码块中的第一个查询返回与tag location
相关联的两个tag value的fieldwater_level
中最大的字段值。它也将这些结果写入measurementtop_water_levels
。 第二个查询显示InfluxDB在top_water_levels
中将location
保存为tag。
> SELECT TOP("water_level","location",2) INTO "top_water_levels" FROM "h2o_feet" name: result time written ---- ------- 1970-01-01T00:00:00Z 2 > SHOW TAG KEYS FROM "top_water_levels" name: top_water_levels tagKey ------ location
Transformations
CEILING()
CEILING()
已经不再是一个函数了,具体请查看Issue #5930。
CUMULATIVE_SUM()
返回字段实时前序字段值的和。
基本语法
SELECT CUMULATIVE_SUM( [ * | <field_key> | /<regular_expression>/ ] ) [INTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] [LIMIT_clause] [OFFSET_clause] [SLIMIT_clause] [SOFFSET_clause]
基本语法描述
CUMULATIVE_SUM(field_key)
返回field key实时前序字段值的和。
CUMULATIVE_SUM(/regular_expression/)
返回满足正则表达式的所有字段的实时前序字段值的和。
CUMULATIVE_SUM(*)
返回measurement的所有字段的实时前序字段值的和。
CUMULATIVE_SUM()
支持所有的数值类型的field。
基本语法支持GROUP BY
tags子句,但是不支持GROUP BY
时间。在高级语法中,CUMULATIVE_SUM
支持GROUP BY time()
子句。
基本语法的例子
下面的1~4例子使用如下的数据:
> SELECT "water_level" FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' AND "location" = 'santa_monica' 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-08-18T00:18:00Z 2.126 2015-08-18T00:24:00Z 2.041 2015-08-18T00:30:00Z 2.051
例一:计算一个字段的实时前序字段值的和。
> SELECT CUMULATIVE_SUM("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' AND "location" = 'santa_monica' name: h2o_feet time cumulative_sum ---- -------------- 2015-08-18T00:00:00Z 2.064 2015-08-18T00:06:00Z 4.18 2015-08-18T00:12:00Z 6.208 2015-08-18T00:18:00Z 8.334 2015-08-18T00:24:00Z 10.375 2015-08-18T00:30:00Z 12.426
该查询返回measurementh2o_feet
的字段water_level
的实时前序字段值的和。
例二:计算measurement中每个字段的实时前序字段值的和
> SELECT CUMULATIVE_SUM(*) FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' AND "location" = 'santa_monica' name: h2o_feet time cumulative_sum_water_level ---- -------------------------- 2015-08-18T00:00:00Z 2.064 2015-08-18T00:06:00Z 4.18 2015-08-18T00:12:00Z 6.208 2015-08-18T00:18:00Z 8.334 2015-08-18T00:24:00Z 10.375 2015-08-18T00:30:00Z 12.426
该查询返回h2o_feet
中每个数值类型的字段的实时前序字段值的和。h2o_feet
只有一个数值类型的字段water_level
。
例三:计算measurement中满足正则表达式的每个字段的实时前序字段值的和。
> SELECT CUMULATIVE_SUM(/water/) FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' AND "location" = 'santa_monica' name: h2o_feet time cumulative_sum_water_level ---- -------------------------- 2015-08-18T00:00:00Z 2.064 2015-08-18T00:06:00Z 4.18 2015-08-18T00:12:00Z 6.208 2015-08-18T00:18:00Z 8.334 2015-08-18T00:24:00Z 10.375 2015-08-18T00:30:00Z 12.426
查询返回measurement中含有单词word
的每个数值字段的实时前序字段值的和。
例四:计算一个字段的实时前序字段值的和,并且包括了多个子句
> SELECT CUMULATIVE_SUM("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' AND "location" = 'santa_monica' ORDER BY time DESC LIMIT 4 OFFSET 2 name: h2o_feet time cumulative_sum ---- -------------- 2015-08-18T00:18:00Z 6.218 2015-08-18T00:12:00Z 8.246 2015-08-18T00:06:00Z 10.362 2015-08-18T00:00:00Z 12.426
查询将返回在2015-08-18T00:00:00Z
和2015-08-18T00:30:00Z
之间的实时前序字段值的和,以降序的时间戳顺序返回结果。并且限制返回的数据点为4,偏移数据点2个。
高级语法
SELECT CUMULATIVE_SUM(<function>( [ * | <field_key> | /<regular_expression>/ ] )) [INTO_clause] FROM_clause [WHERE_clause] GROUP_BY_clause [ORDER_BY_clause] [LIMIT_clause] [OFFSET_clause] [SLIMIT_clause] [SOFFSET_clause]
高级语法描述
高级语法要求一个GROUP BY time()
子句和一个嵌套的InfluxQL函数。查询首先计算在指定时间区间嵌套函数的结果,然后应用CUMULATIVE_SUM()
函数的结果。
CUMULATIVE_SUM()
支持以下嵌套函数:COUNT(), MEAN(), MEDIAN(), MODE(), SUM(), FIRST(), LAST(), MIN(), MAX(), PERCENTILE()
。
高级语法的例子
例一:计算平均值的cumulative和
> SELECT CUMULATIVE_SUM(MEAN("water_level")) FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' AND "location" = 'santa_monica' GROUP BY time(12m) name: h2o_feet time cumulative_sum ---- -------------- 2015-08-18T00:00:00Z 2.09 2015-08-18T00:12:00Z 4.167 2015-08-18T00:24:00Z 6.213
该查询返回每隔12分钟的water_level
的平均值的实时和。
为得到这个结果,InfluxDB首先计算每隔12分钟的平均water_level
值:
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' AND "location" = 'santa_monica' GROUP BY time(12m) name: h2o_feet time mean ---- ---- 2015-08-18T00:00:00Z 2.09 2015-08-18T00:12:00Z 2.077 2015-08-18T00:24:00Z 2.0460000000000003
下一步,InfluxDB计算这些平均值的实时和。第二个点4.167
是2.09
和2.077
的和,第三个点6.213
是2.09
,2.077
和2.04600000000003
的和。
DERIVATIVE
返回字段的相邻两个点的变化率。
基本语法
SELECT DERIVATIVE( [ * | <field_key> | /<regular_expression>/ ] [ , <unit> ] ) [INTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] [LIMIT_clause] [OFFSET_clause] [SLIMIT_clause] [SOFFSET_clause]
基本语法描述
InfluxDB计算字段值之间的差并将结果转换为每unit
变化率。unit
参数是一个表示时间单位的字符,它是可选的。如果查询没有指定,则该unit
默认为1秒(1s)。
DERIVATIVE(field_key)
返回field key的字段值的变化率。
DERIVATIVE(/regular_expression/)
返回满足正则表达式的所有字段的字段值的变化率。
DERIVATIVE(*)
返回measurement的所有字段的字段值的变化率。
DERIVATIVE()
支持所有的数值类型的field。
基本语法支持GROUP BY
tags子句,但是不支持GROUP BY
时间。在高级语法中,DERIVATIVE
支持GROUP BY time()
子句。
基本语法的例子
下面的1~5例子使用如下的数据:
> SELECT "water_level" FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' AND "location" = 'santa_monica' 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-08-18T00:18:00Z 2.126 2015-08-18T00:24:00Z 2.041 2015-08-18T00:30:00Z 2.051
例一:计算一个字段的变化率
> SELECT DERIVATIVE("water_level") FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' name: h2o_feet time derivative ---- ---------- 2015-08-18T00:06:00Z 0.00014444444444444457 2015-08-18T00:12:00Z -0.00024444444444444465 2015-08-18T00:18:00Z 0.0002722222222222218 2015-08-18T00:24:00Z -0.000236111111111111 2015-08-18T00:30:00Z 2.777777777777842e-05
该查询返回measurementh2o_feet
的字段water_level
的每秒变化率。
第一个结果0.00014444444444444457
是原始数据两个相邻字段值到每秒的变化率。InfluxDB计算字段值的变化,并且转化到每秒:
(2.116 - 2.064) / (360s / 1s) -------------- ---------- | | | the difference between the field values' timestamps / the default unit second field value - first field value
例二:计算一个字段的变化率并指定时间单位
> SELECT DERIVATIVE("water_level",6m) FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' name: h2o_feet time derivative ---- ---------- 2015-08-18T00:06:00Z 0.052000000000000046 2015-08-18T00:12:00Z -0.08800000000000008 2015-08-18T00:18:00Z 0.09799999999999986 2015-08-18T00:24:00Z -0.08499999999999996 2015-08-18T00:30:00Z 0.010000000000000231
该查询返回measurementh2o_feet
的字段water_level
的每6分钟的变化率。
第一个结果0.052000000000000046
是原始数据两个相邻字段值到每6分钟的变化率。InfluxDB计算字段值的变化,并且转化到每6分钟:
(2.116 - 2.064) / (6m / 6m) -------------- ---------- | | | the difference between the field values' timestamps / the specified unit second field value - first field value
例三:计算measurement中每个一个字段的变化率并指定时间单位
> SELECT DERIVATIVE(*,3m) FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' name: h2o_feet time derivative_water_level ---- ---------------------- 2015-08-18T00:06:00Z 0.026000000000000023 2015-08-18T00:12:00Z -0.04400000000000004 2015-08-18T00:18:00Z 0.04899999999999993 2015-08-18T00:24:00Z -0.04249999999999998 2015-08-18T00:30:00Z 0.0050000000000001155
该查询返回measurementh2o_feet
中每个数值字段的每3分钟的变化率。该measurement有一个数值字段:water_level
。
第一个结果0.026000000000000023
是原始数据两个相邻字段值到每3分钟的变化率。InfluxDB计算字段值的变化,并且转化到每3分钟:
(2.116 - 2.064) / (6m / 3m) -------------- ---------- | | | the difference between the field values' timestamps / the specified unit second field value - first field value
例四:计算measurement中满足正则表达式每个一个字段的变化率并指定时间单位
> SELECT DERIVATIVE(/water/,2m) FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' name: h2o_feet time derivative_water_level ---- ---------------------- 2015-08-18T00:06:00Z 0.01733333333333335 2015-08-18T00:12:00Z -0.02933333333333336 2015-08-18T00:18:00Z 0.03266666666666662 2015-08-18T00:24:00Z -0.02833333333333332 2015-08-18T00:30:00Z 0.0033333333333334103
该查询返回measurementh2o_feet
中满足正则表达式的每个数值字段的每2分钟的变化率。该measurement有一个数值字段:water_level
。
第一个结果0.01733333333333335
是原始数据两个相邻字段值到每3分钟的变化率。InfluxDB计算字段值的变化,并且转化到每2分钟:
(2.116 - 2.064) / (6m / 2m) -------------- ---------- | | | the difference between the field values' timestamps / the specified unit second field value - first field value
例五:计算个一个字段的变化率并包括多个子句
> SELECT DERIVATIVE("water_level") FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' ORDER BY time DESC LIMIT 1 OFFSET 2 name: h2o_feet time derivative ---- ---------- 2015-08-18T00:12:00Z -0.0002722222222222218
查询将返回在2015-08-18T00:00:00Z
和2015-08-18T00:30:00Z
之间,water_level
的每秒的变化率。它还以降序的时间戳顺序返回结果。 并且限制返回的数据点为1,偏移两个数据点
第一个结果0.0002722222222222218
是原始数据两个相邻字段值到每秒的变化率。InfluxDB计算字段值的变化,并且转化到每秒:
(2.126 - 2.028) / (360s / 1s) -------------- ---------- | | | the difference between the field values' timestamps / the default unit second field value - first field value
高级语法
SELECT DERIVATIVE(<function> ([ * | <field_key> | /<regular_expression>/ ]) [ , <unit> ] ) [INTO_clause] FROM_clause [WHERE_clause] GROUP_BY_clause [ORDER_BY_clause] [LIMIT_clause] [OFFSET_clause] [SLIMIT_clause] [SOFFSET_clause]
高级语法的描述
高级语法要求一个GROUP BY time()
子句和一个嵌套的InfluxQL函数。查询首先计算在指定时间区间嵌套函数的结果,然后应用DERIVATIVE()
函数的结果。
unit
参数是一个整数后面跟时间字符,该参数是可选的。如果没有指定unit
,那么unit
默认就是GROUP BY time()
的间隔。
DERIVATIVE()
支持以下嵌套函数:COUNT(), MEAN(), MEDIAN(), MODE(), SUM(), FIRST(), LAST(), MIN(), MAX(), PERCENTILE()
。
高级语法的例子
例一:计算一个字段平均值的变化率
> SELECT DERIVATIVE(MEAN("water_level")) FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m) name: h2o_feet time derivative ---- ---------- 2015-08-18T00:12:00Z -0.0129999999999999 2015-08-18T00:24:00Z -0.030999999999999694
该查询返回measurementh2o_feet
的字段water_level
的每12分钟的平均值得每12分钟的变化率。
为了得到这个结果,InfluxDB首先计算water_level
每12分钟的间隔的平均值,这一步就是使用带GROUP BY time()
的MEAN()
函数:
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m) name: h2o_feet time mean ---- ---- 2015-08-18T00:00:00Z 2.09 2015-08-18T00:12:00Z 2.077 2015-08-18T00:24:00Z 2.0460000000000003
接下来,InfluxDB计算这些平均值每12分钟的变化率,第一个结果0.0129999999999999
是两个相邻平均字段值到每12分钟的变化率。InfluxDB计算字段值的变化,并且转化到12分钟:
(2.077 - 2.09) / (12m / 12m) ------------- ---------- | | | the difference between the field values' timestamps / the default unit second field value - first field value
例二:计算一个字段平均值的变化率,并指明时间单位
> SELECT DERIVATIVE(MEAN("water_level"),6m) FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m) name: h2o_feet time derivative ---- ---------- 2015-08-18T00:12:00Z -0.00649999999999995 2015-08-18T00:24:00Z -0.015499999999999847
该查询返回measurementh2o_feet
的字段water_level
的每12分钟的平均值得每6分钟的变化率。
为了得到这个结果,InfluxDB首先计算water_level
每12分钟的间隔的平均值,这一步就是使用带GROUP BY time()
的MEAN()
函数:
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m) name: h2o_feet time mean ---- ---- 2015-08-18T00:00:00Z 2.09 2015-08-18T00:12:00Z 2.077 2015-08-18T00:24:00Z 2.0460000000000003
接下来,InfluxDB计算这些平均值每6分钟的变化率,第一个结果0.00649999999999995
是两个相邻平均字段值到每6分钟的变化率。InfluxDB计算字段值的变化,并且转化到6分钟:
(2.077 - 2.09) / (12m / 6m) ------------- ---------- | | | the difference between the field values' timestamps / the specified unit second field value - first field value