docs-v2/content/shared/influxdb3-query-guides/influxql/aggregate-select.md

7.1 KiB

An InfluxQL query that aggregates data includes the following clauses:

{{< req type="key" >}}

  • {{< req "*">}} SELECT: Specify fields and calculations to output from a measurement or use the wildcard alias (*) to select all fields and tags from a measurement.
  • {{< req "*">}} FROM: Specify the measurement to query data from.
  • WHERE: Only retrieve data that meets the specified conditions--for example, time is in a time range, contains specific tag values, or contains a field value outside specified thresholds.
  • GROUP BY: Group data by tag values and time intervals.

[!Note] For simplicity, the term "aggregate" in this guide refers to applying both aggregate and selector functions to a dataset.

Learn how to apply aggregate operations to your queried data:

{{% influxql/v1-v3-data-model-note %}}

Aggregate and selector functions

Both aggregate and selector functions return a limited number of rows from each group. Aggregate functions return a single row, whereas some selector functions let you specify the number of rows to return from each group. For example, if you GROUP BY room and perform an aggregate operation in your SELECT clause, results include an aggregate value for each unique value of room.

Aggregate functions

Use aggregate functions to aggregate values in a specified field for each group and return a single row per group containing the aggregate field value.

View InfluxQL aggregate functions

Basic aggregate query
SELECT MEAN(co) from home

Selector functions

Use selector functions to "select" a value from a specified field.

View InfluxQL selector functions

Basic selector query
SELECT TOP(co, 3) from home

Example aggregate queries

[!Note]

Sample data

The following examples use the Home sensor data. To run the example queries and return results, write the sample data to your {{% product-name %}} database before running the example queries.

Perform an ungrouped aggregation

To aggregate all queried values in a specified field:

  • Use aggregate or selector functions in your SELECT statement.
  • Do not include a GROUP BY clause to leave your data ungrouped.
SELECT MEAN(co) AS "average co" FROM home

{{< expand-wrapper >}} {{% expand "View example results" %}} {{% influxql/table-meta %}} name: home {{% /influxql/table-meta %}}

time average co
0 5.269230769230769
{{% /expand %}}
{{< /expand-wrapper >}}

Group and aggregate data

To apply aggregate or selector functions to grouped data:

  • Use aggregate or selector functions in your SELECT statement.
  • Include a GROUP BY clause with a comma-delimited list of tags to group by.

Keep the following in mind when using GROUP BY:

  • GROUP BY can use column aliases that are defined in the SELECT clause.
SELECT
  MEAN(temp) AS "average temp"
FROM home
GROUP BY room

{{< expand-wrapper >}} {{% expand "View example results" %}}

{{% influxql/table-meta %}} name: home
tags: room=Kitchen {{% /influxql/table-meta %}}

time average temp
0 22.623076923076926

{{% influxql/table-meta %}} name: home
tags: room=Living Room {{% /influxql/table-meta %}}

time average temp
0 22.16923076923077
{{% /expand %}}
{{< /expand-wrapper >}}

Downsample data by applying interval-based aggregates

A common use case when querying time series is downsampling data by applying aggregates to time-based groups. To group and aggregate data into time-based groups:

  • In your SELECT clause, apply aggregate or selector functions to queried fields.

  • In your WHERE clause, include time bounds for the query. Interval-based aggregates produce a row for each specified time interval. If no time bounds are specified in the WHERE clause, the query uses the default time range (1970-01-01T00:00:00Z to now) and returns a row for each interval in that time range.

  • In your GROUP BY clause:

    • Use the time() function to specify the time interval to group by.
    • Optional: Specify other tags to group by.

The following example retrieves unique combinations of time intervals and rooms with their minimum, maximum, and average temperatures.

SELECT
  MAX(temp) AS "max temp",
  MIN(temp) AS "min temp",
  MEAN(temp) AS "average temp"
FROM home
WHERE
  time >= '2022-01-01T08:00:00Z'
  AND time < '2022-01-01T20:00:00Z'
GROUP BY time(2h), room

{{< expand-wrapper >}} {{% expand "View example results" "1" %}} {{% influxdb/custom-timestamps %}}

{{% influxql/table-meta %}} name: home
tags: room=Kitchen {{% /influxql/table-meta %}}

time max temp min temp average temp
2022-01-01T08:00:00Z 23 21 22
2022-01-01T10:00:00Z 22.7 22.4 22.549999999999997
2022-01-01T12:00:00Z 22.8 22.5 22.65
2022-01-01T14:00:00Z 22.8 22.7 22.75
2022-01-01T16:00:00Z 22.7 22.4 22.549999999999997
2022-01-01T18:00:00Z 23.3 23.1 23.200000000000003
2022-01-01T20:00:00Z 22.7 22.7 22.7

{{% influxql/table-meta %}} name: home
tags: room=Living Room {{% /influxql/table-meta %}}

time max temp min temp average temp
2022-01-01T08:00:00Z 21.4 21.1 21.25
2022-01-01T10:00:00Z 22.2 21.8 22
2022-01-01T12:00:00Z 22.4 22.2 22.299999999999997
2022-01-01T14:00:00Z 22.3 22.3 22.3
2022-01-01T16:00:00Z 22.6 22.4 22.5
2022-01-01T18:00:00Z 22.8 22.5 22.65
2022-01-01T20:00:00Z 22.2 22.2 22.2

{{% /influxdb/custom-timestamps %}} {{% /expand %}} {{< /expand-wrapper >}}