文档文档

使用 SQL 聚合数据

一个聚合数据的 SQL 查询包含以下子句

* 必需
  • * SELECT: 指定要从表中输出的字段、标签和计算,或使用通配符别名 (*) 来选择表中的所有字段和标签。
  • * FROM: 指定要从中查询数据的表。
  • WHERE: 仅返回满足指定条件的行——例如,时间在时间范围内,标签具有特定值,或者字段值高于或低于指定阈值。
  • GROUP BY: 对指定列和表达式(例如,聚合函数结果)具有相同值的数据进行分组。

为简单起见,本指南中的动词,“aggregate,” 指的是将聚合函数和选择器函数都应用于数据集。

了解如何将聚合操作应用于您查询的数据

聚合函数和选择器函数

聚合函数和选择器函数都从每个 SQL 组返回单行。例如,如果您使用 GROUP BY room 并在 SELECT 子句中执行聚合操作,则结果将包含 room 的每个唯一值的聚合值。

聚合函数

使用 聚合函数 来聚合每个组中指定列的值,并为每个组返回包含聚合值的单行。

查看 SQL 聚合函数

基础聚合查询
SELECT AVG(co) from home

选择器函数

使用 选择器函数 从指定列“选择”一个值。可用的选择器函数旨在用于时间序列数据。

查看 SQL 选择器函数

每个选择器函数都返回一个 Rust struct (类似于 JSON 对象),表示每个组中指定列的单个时间和值。返回的时间和值取决于选择器函数中的逻辑。例如,selector_first 返回组中第一行中指定列的值。selector_max 返回组中指定列的最大值。

选择器结构体 schema

从选择器函数返回的结构体具有两个属性

  • time: 所选行中的 time
  • value: 所选行中指定列的值
{time: 2023-01-01T00:00:00Z, value: 72.1}

使用选择器函数

每个选择器函数都有两个参数

  • 第一个是操作的列。
  • 第二个是在选择逻辑中使用的时间列。

在您的 SELECT 语句中,执行一个选择器函数,并使用括号表示法来引用 返回的 struct 的属性以填充列值

SELECT
  selector_first(temp, time)['time'] AS time,
  selector_first(temp, time)['value'] AS temp,
  room
FROM home
GROUP BY room

示例聚合查询

示例数据

以下示例使用 家庭传感器示例数据。要运行示例查询并返回结果,请在运行示例查询之前,将 示例数据写入 您的 InfluxDB 3 Core 数据库。

执行未分组的聚合

要聚合指定列中 *所有* 查询的值

  • 在您的 SELECT 语句中使用聚合函数或选择器函数。
  • 不要包含 GROUP BY 子句以使您的数据保持未分组状态。
SELECT avg(co) AS 'average co' from home

查看示例结果

分组和聚合数据

要将聚合函数或选择器函数应用于分组数据

  • 在您的 SELECT 语句中使用聚合函数或选择器函数。
  • 在您的 SELECT 语句中包含要分组的列。
  • 包含一个 GROUP BY 子句,其中包含以逗号分隔的列和表达式列表以进行分组。

使用 GROUP BY 时请记住以下几点

  • GROUP BY 可以使用在 SELECT 子句中定义的列别名。
  • 如果别名与原始列名相同,则 GROUP BY 不会使用别名值。GROUP BY 将使用列的原始值,而不是转换后的别名值。
SELECT
  room,
  avg(temp) AS 'average temp'
FROM home
GROUP BY room

查看示例结果

通过应用基于间隔的聚合来降采样数据

查询时间序列时,一个常见的用例是通过将聚合应用于基于时间的组来降采样数据。要将数据分组并聚合到基于时间的组中

  • 在您的 SELECT 子句中

    • 使用 DATE_BIN 函数 来计算时间间隔,并输出一个列,该列包含每行中最接近 time 时间戳的间隔的开始时间——例如,以下子句计算两小时间隔(源自 Unix 纪元),并返回一个新的 time 列,其中包含最接近 home.time 的间隔的开始时间

      SELECT
        DATE_BIN(INTERVAL '2 hours', time) AS time
      FROM home
      ...
      

      给定一个 time2022-01-01T13:00:50.000Z,输出的 time 列包含 2022-01-01T12:00:00.000Z

    • 在指定列上使用 聚合 函数或 选择器 函数。

  • 在您的 GROUP BY 子句中

    • 指定 DATE_BIN(...) 列的序号引用 (1)。这使您可以按转换后的 time 值进行分组,并保持 time 列名。
    • 指定在 SELECT 子句中指定且未在选择器函数中使用的其他列(例如,room)。
    SELECT
      DATE_BIN(INTERVAL '2 hours', time) AS time
    ...
    GROUP BY 1, room
    ...
    

    要在 GROUP BY 子句中按名称引用 DATE_BIN(...) 结果列,请在 SELECT 子句中分配一个 “time” 以外的别名——例如

    SELECT
      DATE_BIN(INTERVAL '2 hours', time) AS _time
    FROM home
    ...
    GROUP BY _time, room
    
  • 包含一个 ORDER BY 子句,其中包含要排序的列。

以下示例检索时间间隔和房间的唯一组合及其最低、最高和平均温度

SELECT
  DATE_BIN(INTERVAL '2 hours', time) AS time,
  room,
  selector_max(temp, time)['value'] AS 'max temp',
  selector_min(temp, time)['value'] AS 'min temp',
  avg(temp) AS 'average temp'
FROM home
GROUP BY 1, room
ORDER BY room, 1

查看示例结果

GROUP BY time

GROUP BY 子句中,名称 “time” 始终指的是源表中的 time 列。如果要按名称引用计算的时间列,请使用与 “time” 不同的别名,或使用列序号——例如

SELECT
  DATE_BIN(INTERVAL '2 hours', time) AS _time,
  room,
  selector_max(temp, time)['value'] AS 'max temp',
  selector_min(temp, time)['value'] AS 'min temp',
  avg(temp) AS 'average temp'
FROM home
GROUP BY _time, room
ORDER BY room, _time
SELECT
  DATE_BIN(INTERVAL '2 hours', time) AS time,
  room,
  selector_max(temp, time)['value'] AS 'max temp',
  selector_min(temp, time)['value'] AS 'min temp',
  avg(temp) AS 'average temp'
FROM home
GROUP BY 1, room
ORDER BY room, 1

基于聚合值查询行

要根据聚合操作后的值查询数据,请包含一个 HAVING 子句,其中包含定义的谓词条件,例如值阈值。WHERE 子句中的谓词在数据聚合 之前 应用。HAVING 子句中的谓词在数据聚合 之后 应用。

SELECT
  room,
  avg(co) AS 'average co'
FROM home
GROUP BY room
HAVING "average co" > 5

查看示例结果


此页内容是否对您有帮助?

感谢您的反馈!


Flux 的未来

Flux 即将进入维护模式。您可以继续像现在一样使用它,而无需对您的代码进行任何更改。

阅读更多

现已全面上市

InfluxDB 3 Core 和 Enterprise

快速启动。更快扩展。

获取更新

InfluxDB 3 Core 是一个开源、高速、近实时数据引擎,可实时收集和处理数据,并将其持久化到本地磁盘或对象存储。InfluxDB 3 Enterprise 构建在 Core 的基础上,增加了高可用性、读取副本、增强的安全性以及数据压缩功能,从而实现更快的查询和优化的存储。InfluxDB 3 Enterprise 的免费层可供非商业家庭或业余爱好者使用。

欲了解更多信息,请查看