content/flux/v0/get-started/query-basics.md
Most Flux queries follow the same basic structure. Familiarize yourself with the basic concepts and steps to use when querying data with Flux.
The majority of basic Flux queries include the following steps:
from(bucket: "example-bucket") // ── Source
|> range(start: -1d) // ── Filter on time
|> filter(fn: (r) => r._field == "foo") // ── Filter on column values
|> group(columns: ["sensorID"]) // ── Shape
|> mean() // ── Process
Flux input functions retrieve data from a data source. All input functions return a stream of tables.
Flux supports multiple data sources including, time series databases (such as InfluxDB and Prometheus), relational databases (such as MySQL and PostgreSQL), CSV, and more.
Filter functions iterate over and evaluate each input row to see if it matches specified conditions. Rows that meet the conditions are included in the function output. Rows that do not meet the specified conditions are dropped.
Flux provides the following primary filter functions:
range(): filter data based on time.filter(): filter data based on column values.
filter() uses a predicate function defined in the
fn parameter to evaluate input rows.
Each row is passed into the predicate function as a record, r, containing
key-value pairs for each column in the row.Other filter functions are also available. For more information, see Function types and categories – Filters.
Many queries need to modify the structure of data to prepare it for processing. Common data-shaping tasks include regrouping data by column values or by time or pivoting column values into rows.
Functions that reshape data include the following:
group(): modify group keyswindow(): modify _start and _stop values of rows to group data by timepivot(): pivot column values into rowsdrop(): drop specific columnskeep(): keep specific columns and drop all othersProcessing data can take on many forms, and includes the following types of operations:
map() to rewrite each input row.
Transform values with mathematic operations, process strings, dynamically add new columns, and more.{{% note %}}
aggregateWindow() is a helper function
that both shapes and processes data.
The function windows and groups data by time, and then applies an aggregate
or selector function to the restructured tables.
{{% /note %}}
Use InfluxDB sample data to write a basic Flux query that queries data, filters the data by time and column values, and then applies an aggregate.
{{% note %}} Use the InfluxDB Data Explorer or the Flux REPL to build and execute the following basic query. {{% /note %}}
Import the influxdata/influxdb/sample package
and use the sample.data() function
to load the airSensor sample dataset.
import "influxdata/influxdb/sample"
sample.data(set: "airSensor")
{{% note %}}
sample.data() returns data as if it was queried from InfluxDB.
To actually query data from InfluxDB, replace sample.data() with the
from() function.
{{% /note %}}
Pipe the returned data forward into range()
to filter the data by time.
Return data from the last hour.
import "influxdata/influxdb/sample"
sample.data(set: "airSensor")
|> range(start: -1h)
Use filter() to filter rows based on
column values.
In this example, return only rows that include values for the co field.
The field name is stored in the _field column.
import "influxdata/influxdb/sample"
sample.data(set: "airSensor")
|> range(start: -1h)
|> filter(fn: (r) => r._field == "co")
Use mean() to calculate the average value
in each input table.
Because InfluxDB groups data by series,
mean() returns a table for each unique sensor_id containing a single row
with the average value in the _value column.
import "influxdata/influxdb/sample"
sample.data(set: "airSensor")
|> range(start: -1h)
|> filter(fn: (r) => r._field == "co")
|> mean()
Use group() to restructure tables
into a single table:
import "influxdata/influxdb/sample"
sample.data(set: "airSensor")
|> range(start: -1h)
|> filter(fn: (r) => r._field == "co")
|> mean()
|> group()
Results from this basic query should be similar to the following:
{{% note %}}
_start and _stop columns have been omitted.
{{% /note %}}
| _field | _measurement | sensor_id | _value |
|---|---|---|---|
| co | airSensors | TLM0100 | 0.42338714381053716 |
| co | airSensors | TLM0101 | 0.4223251339463061 |
| co | airSensors | TLM0102 | 0.8543452859060252 |
| co | airSensors | TLM0103 | 0.2782783780205422 |
| co | airSensors | TLM0200 | 4.612143110484339 |
| co | airSensors | TLM0201 | 0.297474366047375 |
| co | airSensors | TLM0202 | 0.3336370208486757 |
| co | airSensors | TLM0203 | 0.4948166816959906 |
{{< page-nav prev="/flux/v0/get-started/syntax-basics/" >}}