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

GROUP BY子句通过用户自己制定的tags set或time区间,来将查询结果进行分组。

一、GROUP BY tags

GROUP BY 通过用户指定的tag set,来对查询结果进行分组。

语法:

SELECT_clause FROM_clause [WHERE_clause]
GROUP BY [* | <tag_key>[,<tag_key]]
GROUP BY子句 意义
GROUP BY * 使用所有tag对查询结果进行分组
GROUP BY <tag_key> 使用指定tag对查询结果进行分组
GROUP BY <tag_key>,<tag_key> 使用指定的多个tag对查询结果进行分组,其中tag之间的顺序是无关的。

:如果在sql中同时存在WHERE子句和GROUP BY子句,则GROUP BY子句一定要在WHERE子句之后!

Other supported features: Regular Expressions


GROUP BY tags 示例sql

  1. Group query results by a single tag



    上面的sql使用了MEAN函数,来对h2o_feet这个measurement中的location这个tag进行分组求平均值。

    注:在InfluxDB中,0纪元1970-01-01T00:00:00Z这个时间经常被用来表示timestamp的NULL值。如果你的查询中没有显示指定返回一个timestamp,比如上面在调用聚合函数时,就没有指定时间区间,因此InfluxDB最后返回0纪元来作为timestamp。

  2. Group query results by more than one tag

  3. Group query results by all tags


二、基础GROUP BY time intervals

GROUP BY time() 查询会将查询结果按照用户指定的时间区间来进行分组。

语法:

SELECT <function>(<field_key>) FROM_clause
WHERE <time_range>
GROUP BY time(<time_interval>),[tag_key] [fill(<fill_option>)]

基本的 GROUP BY time() 查询用法需要在SELECT子句中调用相关函数,并且在WHERE子句中调用time时间区间。

  • time(time_interval)

    在GROUP BY time()子句中的time_interval是个连续的时间区间,该时间区间决定了InfluxDB如何通过时间来对查询结果进行分组。比如,如果time_interval为5m,那么它会将查询结果分为5分钟一组(如果在WHERE子句中指定了time区间,那么就是将WHERE中指定的time区间划分为没5分钟一组)。

  • fill(<fill_option>)

    fill(<fill_option>) 是可选的。它可以填充那些没有数据的时间区间的值。 从 [GROUP BY time intervals and fill() ] (https://docs.influxdata.com/influxdb/v1.7/query_language/data_exploration/#group-by-time-intervals-and-fill) 部分可查看到关于这部分的更多信息。

    注:基本的GROUP BY time()查询通过当前InfluxDB数据库的预设时间边界来确定每个时间间隔中包含的原始数据和查询返回的时间戳。


基本用法示例sql

先看一个WHERE查询

下面的GROUP BY time(time_interval)示例是在上面的sql基础上进行改进的,sql为:

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

查询结果:



该sql将h2o_feet表中tag=“coyote_creek”,且在'2015-08-18T00:00:00Z'和'2015-08-18T00:30:00Z'时间区间内的数据查询出来,并对其划分为每12分钟一组,对water_level值进行count计算。

注意:在查询结果中,时间区间是左闭右开的。拿第一行查询结果数据来说,2015-08-18T00:00:00Z表示的时间区间是[2015-08-18T00:00:00, 2015-08-18T00:12:00Z )


常见问题

问题:查询结果中有预期之外的时间区间和值。

在基本用法中,GROUP BY time()查询通过当前InfluxDB数据库的预设时间边界来确定每个时间间隔中包含的原始数据和查询返回的时间戳,这有可能会导致预期之外的结果值。

比如,通过如下sql:

SELECT "water_level" FROM "h2o_feet"
WHERE "location"='coyote_creek'
AND time >= '2015-08-18T00:00:00Z'
AND time <= '2015-08-18T00:18:00Z'

我们查询到原始数据如下所示:

在接下来的查询中,我们通过WHERE子句,指定查询12分钟内的数据,并通过GROUP BY子句,将查询结果按12分钟的时间区间进行分组。

SELECT COUNT("water_level") FROM "h2o_feet"
WHERE "location"='coyote_creek'
AND time >= '2015-08-18T00:06:00Z'
AND time < '2015-08-18T00:18:00Z'
GROUP BY time(12m)

按照预想,因为查询的是12分钟内的数据,并且group by时是按照12分钟来进行分组的,所以最后的查询结果应该只有一行而已。然后实际的查询结果却有两行:

解释

influxdb使用预设的整数时间边界来作为GROUP BY的时间间隔,这些间隔独立于WHERE子句中的任何时间条件。在计算结果时,所有返回的数据都必须出现在WHERE查询的显式时间范围内,但当按间隔作为GROUP BY分组时是基于预设的时间边界。

(这里翻译的不好,下面是原版英文:

InfluxDB uses preset round-number time boundaries for GROUP BY intervals that are independent of any time conditions in the WHERE clause. When it calculates the results, all returned data must occur within the query’s explicit time range but the GROUP BY intervals will be based on the preset time boundaries.

高级的GROUP BY time()语法允许用户自定义预设时间边界的开始时间。在高级语法小节的示例sql3中,将展示这种用法,它查询的结果如下:


三、高级GROUP BY time() 语法

语法如下:

SELECT <function>(<field_key>)
FROM_clause
WHERE <time_range>
GROUP BY time(<time_interval>,<offset_interval>),[tag_key] [fill(<fill_option>)]

在GROUP BY time()高级语法中,需要在SELECT子句中调用InfluxDB的函数,并在WHERE子句中指定时间区间。并且需要注意到的是,GROUP BY子句必须在WHERE子句之后!

  • time(time_interval,offset_interval)

    在GROUP BY time()子句中的通过time_interval和offset_interval来表示一个连续的时间区间,该时间区间决定了InfluxDB如何通过时间来对查询结果进行分组。比如,如果时间区间为5m,那么它会将查询结果分为5分钟一组(如果在WHERE子句中指定了time区间,那么就是将WHERE中指定的time区间划分为没5分钟一组)。

    offset_interval是持续时间文本。它向前或向后移动InfluxDB数据库的预设时间边界。offset_interval可以为正或负。

  • fill(<fill_option>)

    fill(<fill_option>)是可选的。 它可以填充那些没有数据的时间区间的值。 从 GROUP BY time intervals and fill() 部分可查看到关于这部分的更多信息。

    :高级 GROUP BY time() 语法依赖于time_interval、offset_interval、以及 InfluxDB 数据库的预设时间边界来确定每组内的数据条数、以及查询结果的时间戳。


高级用法示例sql

先看如下查询sql

SELECT "water_level" FROM "h2o_feet"
WHERE "location"='coyote_creek'
AND time >= '2015-08-18T00:00:00Z'
AND time <= '2015-08-18T00:54:00Z'

查询结果:



接下来将使用上面的样例数据的子集来进行演示。以下sql将按照每18m对数据进行进组,并将预设的时间界限前移。

ELECT MEAN("water_level") FROM "h2o_feet"
WHERE "location"='coyote_creek'
AND time >= '2015-08-18T00:06:00Z'
AND time <= '2015-08-18T00:54:00Z'
GROUP BY time(18m,6m)

查询结果:



可见上面sql将查询结果按照每18m为一组进行了分组,并且将预设的时间界限偏移了6分钟。

注意,对于没有offset_interval的group by time(),它的查询结果的时间边界和返回的时间戳遵循influxdb数据库的预设时间边界。下面我们看offset_interval的group by time()的查询结果:

SELECT MEAN("water_level") FROM "h2o_feet"
WHERE "location"='coyote_creek'
AND time >= '2015-08-18T00:06:00Z'
AND time <= '2015-08-18T00:54:00Z'
GROUP BY time(18m)



再看如下sql:

SELECT MEAN("water_level") FROM "h2o_feet"
WHERE "location"='coyote_creek'
AND time >= '2015-08-18T00:06:00Z'
AND time <= '2015-08-18T00:54:00Z'
GROUP BY time(18m,-12m);

查询结果



:该sql使用的是time(18m,-12m),offset_interval是负数,它的查询结果跟使用time(18m,6m)是一样的。因此在决定正负偏移间隔时,请随意选择最直观的选项。


GROUP BY time intervals and fill()

Fill() 可以填充那些没有数据的时间区间的值。

语法:

SELECT <function>(<field_key>) FROM_clause
WHERE <time_range>
GROUP BY time(time_interval,[<offset_interval])[,tag_key] [fill(<fill_option>)]

默认情况下,在GROUP BY time()查询结果中,若某个时间区间没有数据,则该时间区间对应的值为null。通过fill(),就可以填充那些没有数据的时间区间的值。

需要注意的是,fill()必须出现在GROUP BY子句的最后。

Fill选项

  1. 任何数学数值

    使用给定的数学数值进行填充
  2. linear

    为没有数据值的时间区间线性插入数值,使得插入之后的数值,跟其他本来就有数据的区间的值成线性。(这里翻译的不是很好,看示例就能明白了)
  3. none

    若某个时间区间内没有数据,则在查询结果中该区间对应的时间戳将不显示出来
  4. null

    没有值的区间,显示为null。这也是默认的选项。
  5. previous

    用前一个区间的数值来填充当前没有数据的区间的值。

示例:

  1. fill(100)

  2. fill(linear)

  3. fill(none)

  4. fill(null)

  5. fill(previous)


6.InfluxDB-InfluxQL基础语法教程--GROUP BY子句的更多相关文章

  1. 8.InfluxDB-InfluxQL基础语法教程--ORDER BY子句

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

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

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

  3. 7.InfluxDB-InfluxQL基础语法教程--INTO子句

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

  4. 前端开发利器 Emmet 介绍与基础语法教程

    在前端开发的过程中,编写 HTML.CSS 代码始终占据了很大的工作比例.特别是手动编写 HTML 代码,效率特别低下,因为需要敲打各种“尖括号”.闭合标签等.而现在 Emmet 就是为了提高代码编写 ...

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

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

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

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

  7. 9.InfluxDB-InfluxQL基础语法教程--LIMIT and SLIMIT 子句

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

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

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

  9. 3.InfluxDB-InfluxQL基础语法教程--数据说明

    下面是本次演示的示例数据 表名:h2o_feet 数据示例: 数据描述 : 表h2o_feet中所存储的是6分钟时间区间内的数据. 该表有一个tag,即location,该tag有两个值,分别为coy ...

随机推荐

  1. SIA-GateWay之API网关安装部署指南

    SIA-GATEWAY是基于SpringCloud微服务生态体系下开发的一个分布式微服务网关系统.具备简单易用.可视化.高可扩展.高可用性等特征,提供云原生.完整及成熟的接入服务解决方案.本文介绍AP ...

  2. mariadb数据库galera下添加新的服务器节点

    昨天经过各种努力,终于完成了两台服务器集成的搭建,今天再新开一台服务器,在想如何加入呢?网上度娘了很久结果没搜到相关文章:哎,索性直接照着前两台服务配置,在第三台(新服务器)上配置完成后重启maria ...

  3. 【LeetCode】105#从前序与中序遍历序列构造二叉树

    题目描述 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9 ...

  4. Storm 系列(三)—— Storm 单机版本环境搭建

    1. 安装环境要求 you need to install Storm's dependencies on Nimbus and the worker machines. These are: Jav ...

  5. Vert.x学习之 Web Client

    Vert.x Web Client 原文档 组件源码 组件示例 中英对照表 Pump:泵(平滑流式数据读入内存的机制,防止一次性将大量数据读入内存导致内存溢出) Response Codec:响应编解 ...

  6. NOIP要炸?

    今天起床,翻我的群,突然看见一条消息: “NOIP要被禁赛了!” 莫名奇妙啊...... 于是我就进去看了看,网上疯传,搞得跟真的一样,差点吓到我了. 但好在每个人心中都有一个阿Q,会精神胜利法,于是 ...

  7. 《Java 8 in Action》Chapter 10:用Optional取代null

    1965年,英国一位名为Tony Hoare的计算机科学家在设计ALGOL W语言时提出了null引用的想法.ALGOL W是第一批在堆上分配记录的类型语言之一.Hoare选择null引用这种方式,& ...

  8. 数据可视化之3D中国

    本文链接:https://blog.csdn.net/zhai_865327/article/details/82983489 其实一般情况下2D平面地图就够用了,但是为了更加美观及突出效果,就需要3 ...

  9. thinkphp6.0 composer 安装 web-token/jwt-framework 常见出错原因分析及解决方法

    composer require web-token/jwt-framework 安装JWT出现错误提示 - web-token/jwt-framework v2.0.1 requires ext-g ...

  10. TCGA各种肿瘤数据的20多种不同玩法/挖掘方法

    肿瘤基因组图谱 (The Cancer Genome Atlas,TCGA) 计划是由美国国家癌症研究院(National Cancer Institute,NCI)和美国国家人类基因组研究所(Nat ...