GVKun编程网logo

基于聚合函数的InfluxQL过滤(通过聚合函数的结果来过滤查询结果集)

28

本文将分享基于聚合函数的InfluxQL过滤的详细内容,并且还将对通过聚合函数的结果来过滤查询结果集进行详尽解释,此外,我们还将为大家带来关于10.InfluxDB-InfluxQL基础语法教程--O

本文将分享基于聚合函数的InfluxQL过滤的详细内容,并且还将对通过聚合函数的结果来过滤查询结果集进行详尽解释,此外,我们还将为大家带来关于10.InfluxDB-InfluxQL基础语法教程--OFFSET 和SOFFSET子句、2.InfluxDB-InfluxQL基础语法教程--目录、4.InfluxDB-InfluxQL基础语法教程--基本select语句、5.InfluxDB-InfluxQL基础语法教程--WHERE子句的相关知识,希望对你有所帮助。

本文目录一览:

基于聚合函数的InfluxQL过滤(通过聚合函数的结果来过滤查询结果集)

基于聚合函数的InfluxQL过滤(通过聚合函数的结果来过滤查询结果集)

如何解决基于聚合函数的InfluxQL过滤?

我有大量传感器数据存储在涌入中,在过滤掉传感器故障的异常值之后,我想对其进行汇总。数据带有会话ID标记,我将“故障”定义为在会话期间的任何时候每秒感测到的值每秒变化超过N个单位。

我很希望能够编写类似SELECT sum("value") FROM "data" WHERE max(derivative("value")) > N GROUP BY "session_id"的查询,但是InfluxQL不允许使用WHERE子句中的函数来链接函数,也不允许混合聚合字段和非聚合字段。

相反,我有如下内容:

SELECT derivative("value"),difference("value") INTO "data_derivative" FROM "data" GROUP BY "session_id"
SELECT max("derivative"),cumulative_sum("value") INTO "data_derivative_max" FROM "data_derivative" GROUP BY "session_id"
SELECT sum("cumulative_sum") FROM "data_derivative_max" WHERE "max" < N

这感觉完全是疯了,肯定有更好的方法吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

10.InfluxDB-InfluxQL基础语法教程--OFFSET 和SOFFSET子句

10.InfluxDB-InfluxQL基础语法教程--OFFSET 和SOFFSET子句

本文翻译自官网,官网地址:(https://docs.influxdata.com/influxdb/v1.7/query_language/data_exploration/)

OFFSET 和SOFFSET对返回的points和series进行分页。

一、OFFSET子句

OFFSET <N> 将从查询结果的第N个points开始进行分页。
语法:

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

OFFSET<N>中的N表示从查询结果的第N个points开始进行分页。注意OFFSET必须和LIMIT搭配使用,如果只有OFFSET而没有LIMIT,将会导致不一致的查询结果。

OFFSET示例sql

  1. 示例1
    为了对比效果更明显,我们先看下面的sql

上面的sql查询除了measurement的前10行
接下来看下面的sql

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

可以看到,LIMIT 3 OFFSET 4将查询结果的从下标4开始的第5、6、7行总共3行显示了出来。

  1. 示例2 Sql
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

这个例子非常复杂,下面是逐条分解:

  • The SELECT clause specifies an InfluxQL function.
  • The FROM clause specifies a single measurement.
  • The WHERE clause specifies the time range for the query.
  • The GROUP BY clause groups results by all tags (*) and into 12-minute intervals.
  • The ORDER BY time DESC clause returns results in descending timestamp order.
  • The LIMIT 2 clause limits the number of points returned to two.
  • The OFFSET 2 clause excludes the first two averages from the query results.
  • The SLIMIT 1 clause limits the number of series returned to one.
  • The SOFFSET 1 clause paginates the series returned.

如果上面的sql中没有SOFFSET 2,则会查询到不同的series:


二、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>

SOFFSET <N>中的N指定了开始分页的地方,SOFFSET要跟SLIMIT子句一同搭配使用。如果只使用SOFFSET而没有SLIMIT子句,则可能会导致不一致的查询结果。


SOFFSET示例sql

  1. 示例1
    上面的sql将h2o_feet表中tag的 location = santa_monica的所有数据。如果没有SOFFSET 1子句,查询结果将会变成是location = coyote_creek的数据。为了更好的说明这个问题,依次看下面的示例。
SELECT count("water_level") FROM "h2o_feet" GROUP BY *

可以看到,上面的sql查询出每个tag的water_level字段个数。 让我们在上面sql的基础上,加上SLIMIT 1:
因为加上了SLIMIT 1,所以查询结果只展示了第一个tag的结果。
再在上面sql的基础上加上SOFFSET 1:

可见,因为加上了SOFFSET 1,所以查询结果从第二个series开始展示(下标是从0开始的)。

  1. 示例2 接下来看一个更复杂的sql
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

示例sql相对比较复杂,下面将逐个子句的进行分析(挺简单的,不翻译了):

  • The SELECT clause specifies an InfluxQL function.
  • The FROM clause specifies a single measurement.
  • The WHERE clause specifies the time range for the query.
  • The GROUP BY clause groups results by all tags (*) and into 12-minute intervals.
  • The ORDER BY time DESC clause returns results in descending timestamp order.
  • The LIMIT 2 clause limits the number of points returned to two.
  • The OFFSET 2 clause excludes the first two averages from the query results.
  • The SLIMIT 1 clause limits the number of series returned to one.
  • The SOFFSET 1 clause paginates the series returned.
    如果没有SOFFSET 1,查询结果将会是:

可以看到,查询到的是另一个series的数据。

2.InfluxDB-InfluxQL基础语法教程--目录

2.InfluxDB-InfluxQL基础语法教程--目录

本文翻译自官网,官方文档地址:(https://docs.influxdata.com/influxdb/v1.7/query_language/data_exploration/)

<kbd>InfluxQL</kbd>是用于在InfluxDB中进行数据探索的类似于SQL的查询语法。下面将详细介绍在InfluxDB中使用select语句的情形。

接下来介绍的语法如下面的表格所示。

The Basics Configure Query Results General Tips on Query Syntax
The SELECT statement ORDER BY time DESC Time Syntax
The WHERE clause The LIMIT and SLIMIT clauses Regular Expressions
The GROUP BY clause The OFFSET and SOFFSET clauses Data types and cast operations
The INTO clause The Time Zone clause Merge behavior
Multiple statements
Subqueries

目录

  1. InfluxDB-InfluxQL基础语法教程--数据说明
  2. InfluxDB-InfluxQL基础语法教程--基本select语句
  3. InfluxDB-InfluxQL基础语法教程--WHERE子句
  4. InfluxDB-InfluxQL基础语法教程--GROUP BY子句
  5. InfluxDB-InfluxQL基础语法教程--INTO子句
  6. InfluxDB-InfluxQL基础语法教程--ORDER BY子句
  7. InfluxDB-InfluxQL基础语法教程--LIMIT and SLIMIT 子句
  8. InfluxDB-InfluxQL基础语法教程--OFFSET 和SOFFSET子句

4.InfluxDB-InfluxQL基础语法教程--基本select语句

4.InfluxDB-InfluxQL基础语法教程--基本select语句

本文翻译自官网,官网地址:(https://docs.influxdata.com/influxdb/v1.7/query_language/data_exploration/)
基本语法如下:

SELECT <field_key>[,<field_key>,<tag_key>] FROM <measurement_name>[,<measurement_name>]

可见,select语句是由SELECT子句和FROM子句组成的。


一、SELECT子句

在SELECT字句中,有如下几种形式,分别用于查询各种指定的数据:

语法 意思
SELECT * 查询measurement中所有的fields和 tags。示例sql:<kbd>select * from h2o_feet;</kbd>
SELECT "<field_key>" 查询指定的一个field。示例sql:<kbd>select water_level from h2o_feet;</kbd>
SELECT "<field_key>","<field_key>" 查询多个field。示例sql:<kbd>select "level description", "water_level" from h2o_feet;</kbd>
SELECT "<field_key>","<tag_key>"  查询指定的field和tag。示例sql:<kbd>select water_level,location from h2o_feet;</kbd> :在SELECT子句中,如果包含了tag,那么此时就必须指定至少一个field。比如如下的sql就是错误的,因为它只select了一个tag,而没有field:<kbd>select location from h2o_feet;</kbd>
SELECT "<field_key>"::field,"<tag_key>"::tag 跟上面一样,也是查询指定的field和tag。 ::[field | tag]语法用来指定标识符的类型,因为有时候tag和field有可能同名,因此用 ::[field | tag]语法来加以区分。

在SELECT子句中,还包含数学运算、聚合函数、基本的类型转换、正则表达式等。


二、FROM子句

FROM子句用于指定要查询的measurement,支持的语法如下:

语法 意思
FROM <measurement_name> 从指定measurement中查询数据。这种方式会从当前DB、默认retention policy的measurement中查询数据。
FROM <measurement_name>,<measurement_name> 从多个measurement中查询数据
FROM <database_name>.<retention_policy_name>.<measurement_name> 从指定DB、指定retention policy的measurement中查询数据
FROM <database_name>..<measurement_name> 从指定DB、默认retention policy的measurement 中查询数据

FROM子句中还支持正则表达式。

关于引号

如果measurement、tag、field等的标识符除了[A-z,0-9,_]之外,还有其他字符,或者标识符是keyword关键字,那么在引用的时候必须加上双引号。比如在表 h2o_feet 中,"level description"就是一个带有空格的field,如此一来在查询到的时候,就必须加上双引号了。如下图,在查询level description时若不加双引号,则会报错。

<font color=DarkRed size=4>官方推荐,虽然有些标识符不是必须使用双引号,但是推荐对所有标识符使用双引号!</font>


示例sql

  1. 从单个measurement中查询该measurement所有的tag和field

  2. 从单个measurement中查询指定的tag和field

  3. 从单个measurement中查询指定的tag和field,并指定它们的标识类型
    这种方式一般使用较少。

  4. 从measurement中查询所有的field

    The SELECT clause supports combining the * syntax with the :: syntax.

  5. 在查询时进行基本的数学运算
    InfluxDB遵循标准的四则运算规则。更多操作详见Mathematical Operators。

  6. 同时从多个measurement中查询它们的所有数据

  7. 从一个全路径的measurement中查询数据

    可见,所谓的全路径,其实就是指在FROM子句中,指定了measurement所在的DB,以及要查询数据所在的retention policy。

  8. 查询指定数据库中的measurement的数据

    The query selects data in the NOAA_water_database, the DEFAULT retention policy, and the h2o_feet measurement. The .. indicates the DEFAULT retention policy for the specified database.


关于SELECT语句的常见疑问

在SELECT 子句中,必须要有至少一个field key!如果在SELECT子句中只有一个或多个tag key,那么该查询会返回空。这是由InfluxDB底层存储数据的方式所导致的结果。
示例


上面的查询结果返回为空,是因为在它的SELECT子句中,只查询了location这个tag key。
如果想要查询跟location这个tag key有关的任何数据,则在SELECT字句中必须至少要包含一个field key,如下:


5.InfluxDB-InfluxQL基础语法教程--WHERE子句

5.InfluxDB-InfluxQL基础语法教程--WHERE子句

本文翻译自官网,官网地址:(https://docs.influxdata.com/influxdb/v1.7/query_language/data_exploration/)

WHERE子句

语法:

SELECT_clause FROM_clause WHERE <conditional_expression> [(AND|OR) <conditional_expression> [...]]

:在WHERE子句中,支持在fields, tags, and timestamps上进行条件表达式的运算。
:在InfluxDB的WHERE子句中,不支持使用 OR 来指定不同的time区间,如下面的sql将会返回空:

SELECT * FROM "absolutismus" WHERE time = ''2016-07-31T20:07:00Z'' OR time = ''2016-07-31T23:07:17Z''

Fields

语法如下:

field_key <operator> [''string'' | boolean | float | integer]

在WHERE子句中,支持对string, boolean, float 和 integer类型的field values进行比较。

注意 :<font color=Red size=3>在WHERE子句中,如果是string类型的field value,一定要用单引号括起来。如果不适用引号括起来,或者使用的是双引号,将不会返回任何数据,有时甚至都不报错! </font>

WHERE支持的运算符如下:

Operator Meaning
= equal to
<> not equal to
!= not equal to
> greater than
>= greater than or equal to
< less than
<= less than or equal to

支持的更多运算符详见: Arithmetic Operations, Regular Expressions

Tags

语法如下:

tag_key <operator> [''tag_value'']

<font color=Red size=3>对于在WHERE子句中的tag values,也要用单引号括起来。如果不用引号括起来,或者使用双引号,则查询不会返回任务数据。甚至不会报错。</font>

Tag支持的运算符如下:

Operator Meaning
= equal to
<> not equal to
!= not equal to

还支持正则运算: Regular Expressions

Timestamps

对于大部分的SELECT 语句来说,默认的时间区间是1677-09-21 00:12:43.145224194 到 2262-04-11T23:47:16.854775806Z UTC. 对于有GROUP BY time() 的SELECT 语句,默认的时间区间是1677-09-21 00:12:43.145224194 UTC 到 now()。

在 Time Syntax 小节将会介绍如何在WHERE子句中指定时间 区间。


WHERE示例sql

  1. Select data that have specific field key-values

  2. Select data that have a specific string field key-value InfluxQL requires single quotes around string field values in the WHERE clause.

  3. Select data that have a specific field key-value and perform basic arithmetic

  4. Select data that have a specific tag key-value InfluxQL requires single quotes around tag values in the WHERE clause.

  5. Select data that have specific field key-values and tag key-values The WHERE clause supports the operators AND and OR, and supports separating logic with parentheses.

  1. Select data that have specific timestamps 该sql将查询h2o_feet中在7天以内的所有数据

关于WHERE语句的常见疑问

问题 :where子句查询意外地未返回任何数据。

:通常情况,出现该问题是因为在WHERE子句中没有对tag values或string类型的field values使用单引号括起来的缘故。对于WHERE子句中的tag values或string类型的field values,如果没有用引号括起来,或者是用的双引号,这种时候,查询不会返回任何结果,有时甚至也不会报错。
在下面的示例sql中,对tag value的引号使用做说明。第一个sql没有对tag value使用引号,第二个sql对tag value使用了双引号,第三个sql则对tag value使用了单引号。可以看到,第一和第二个sql都没有返回任何查询结果,而第三个sql返回了预期中的结果。

在下面的sql对string类型的field value的引号情况做说明,其中field value为“at or greater than 9 feet”。第一个sql没有对field value使用引号,第二个sql对field value使用了双引号,第三个sql则对field value使用了单引号。可以看到,第一个sql报错了,因为field valus中包含了空格。第二个sql虽然没报错,但是查询结果为空。第三个sql返回了预期中的结果。

我们今天的关于基于聚合函数的InfluxQL过滤通过聚合函数的结果来过滤查询结果集的分享就到这里,谢谢您的阅读,如果想了解更多关于10.InfluxDB-InfluxQL基础语法教程--OFFSET 和SOFFSET子句、2.InfluxDB-InfluxQL基础语法教程--目录、4.InfluxDB-InfluxQL基础语法教程--基本select语句、5.InfluxDB-InfluxQL基础语法教程--WHERE子句的相关信息,可以在本站进行搜索。

本文标签: