---
title: InfluxQL selector functions
description: Use InfluxQL selector functions to select specific points from your time series data.
url: https://docs.influxdata.com/influxdb3/enterprise/reference/influxql/functions/selectors/
estimated_tokens: 16629
product: InfluxDB 3 Enterprise
version: enterprise
---

# InfluxQL selector functions

Use selector functions to assess, select, and return values in your data. Selector functions return one or more rows with the selected values from each InfluxQL group.

*Examples use the sample data set provided in the [Get started with InfluxDB tutorial](/influxdb3/enterprise/get-started/write/#construct-line-protocol).*

-   [BOTTOM()](#bottom)
-   [FIRST()](#first)
-   [LAST()](#last)
-   [MAX()](#max)
-   [MIN()](#min)
-   [PERCENTILE()](#percentile)
-   [TOP()](#top)
-   [Notable behaviors of selector functions](#notable-behaviors-of-selector-functions)

#### Missing InfluxQL functions

Some InfluxQL functions are in the process of being rearchitected to work with the InfluxDB 3 storage engine. If a function you need is not here, check the [InfluxQL feature support page](/influxdb3/enterprise/reference/influxql/feature-support/#function-support) for more information.

## BOTTOM()

Returns the smallest `N` [field values](/influxdb3/enterprise/reference/glossary/#field-value). `BOTTOM()` supports int64 and float64 field value [data types](/influxdb3/enterprise/reference/glossary/#field-value).

```sql
BOTTOM(field_expression[, tag_expression_1[, ..., tag_expression_n]], N)
```

**Note:** `BOTTOM()` returns the field value with the earliest timestamp if there’s a tie between two or more values for the smallest value.

#### Arguments

-   **field\_expression**: Expression to identify the field to operate on. Can be a [field key](/influxdb3/enterprise/reference/glossary/#field-key) or constant.
-   **tag\_expression**: Expression to identify a tag key to segment by. Can be a [tag key](/influxdb3/enterprise/reference/glossary/#tag-key) or constant. Comma-delimit multiple tags.
-   **N**: Number of results to return from each InfluxQL group or specified tag segment.

#### Notable behaviors

-   `BOTTOM()` [maintains original timestamps when grouping by time](#timestamps-when-grouping-by-time).
-   `BOTTOM()` [may return fewer points than expected](#selector-functions-may-return-fewer-points-than-expected).

#### Examples

[](#select-the-bottom-three-values-of-a-field)

Select the bottom three values of a field

```sql
SELECT BOTTOM(temp, 3) FROM home
```

name: home

| time | bottom |
| --- | --- |
| 2022-01-01T08:00:00Z | 21 |
| 2022-01-01T08:00:00Z | 21.1 |
| 2022-01-01T09:00:00Z | 21.4 |

[](#select-the-bottom-field-value-for-two-unique-tag-values)

Select the bottom field value for two unique tag values

```sql
SELECT BOTTOM(temp, room, 2) FROM home
```

name: home

| time | bottom | room |
| --- | --- | --- |
| 2022-01-01T08:00:00Z | 21 | Kitchen |
| 2022-01-01T08:00:00Z | 21.1 | Living Room |

[](#select-the-bottom-three-field-values-and-the-tag-value-associated-with-each)

Select the bottom three field values and the tag value associated with each

```sql
SELECT BOTTOM(temp, 3), room FROM home
```

name: home

| time | bottom | room |
| --- | --- | --- |
| 2022-01-01T08:00:00Z | 21 | Kitchen |
| 2022-01-01T08:00:00Z | 21.1 | Living Room |
| 2022-01-01T09:00:00Z | 21.4 | Living Room |

[](#select-the-bottom-field-values-for-unique-tag-values-and-within-time-windows-grouped-by-time)

Select the bottom field values for unique tag values and within time windows (grouped by time)

```sql
SELECT
  BOTTOM(temp, room, 2)
FROM home
WHERE
  time >= '2022-01-01T08:00:00Z'
  AND time <= '2022-01-01T12:00:00Z'
GROUP BY time(2h)
```

name: home

| time | bottom | room |
| --- | --- | --- |
| 2022-01-01T08:00:00Z | 21 | Kitchen |
| 2022-01-01T08:00:00Z | 21.1 | Living Room |
| 2022-01-01T10:00:00Z | 21.8 | Living Room |
| 2022-01-01T11:00:00Z | 22.4 | Kitchen |
| 2022-01-01T12:00:00Z | 22.2 | Living Room |
| 2022-01-01T12:00:00Z | 22.5 | Kitchen |

Notice that when grouping by time, `BOTTOM()` [maintains the point’s original timestamp](#timestamps-when-grouping-by-time).

## FIRST()

Returns the [field value](/influxdb3/enterprise/reference/glossary/#field-value) with the oldest timestamp.

```sql
FIRST(field_expression)
```

#### Arguments

-   **field\_expression**: Expression to identify one or more fields to operate on. Can be a [field key](/influxdb3/enterprise/reference/glossary/#field-key), constant, regular expression, or wildcard (`*`). Supports all field [data types](/influxdb/v2/query-data/influxql/explore-data/select/#data-types).

#### Notable behaviors

-   `FIRST()` [overrides original timestamps when grouping by time](#timestamps-when-grouping-by-time)

#### Examples

[](#select-the-first-value-for-a-field)

Select the first value for a field

```sql
SELECT FIRST(temp) FROM home
```

name: home

| time | first |
| --- | --- |
| 2022-01-01T08:00:00Z | 21.1 |

[](#select-the-first-value-from-each-field)

Select the first value from each field

```sql
SELECT FIRST(*) FROM home
```

name: home

| time | first_co | first_hum | first_temp |
| --- | --- | --- | --- |
| 1970-01-01T00:00:00Z | 0 | 35.9 | 21.1 |

[](#select-the-first-value-from-field-keys-that-match-a-regular-expression)

Select the first value from field keys that match a regular expression

```sql
SELECT FIRST(/^[th]/) FROM home
```

name: home

| time | first_hum | first_temp |
| --- | --- | --- |
| 1970-01-01T00:00:00Z | 35.9 | 21.1 |

[](#select-the-first-value-from-a-field-within-time-windows-grouped-by-time)

Select the first value from a field within time windows (grouped by time)

```sql
SELECT
  FIRST(temp)
FROM home 
WHERE
  room = 'Kitchen'
  AND time >= '2022-01-01T08:00:00Z'
  AND time <= '2022-01-01T20:00:00Z'
GROUP BY time(6h)
```

name: home

| time | first |
| --- | --- |
| 2022-01-01T06:00:00Z | 21 |
| 2022-01-01T12:00:00Z | 22.5 |
| 2022-01-01T18:00:00Z | 23.3 |

Notice that when grouping by time, `FIRST()` [overrides the point’s original timestamp](#timestamps-when-grouping-by-time).

## LAST()

Returns the [field value](/influxdb3/enterprise/reference/glossary/#field-value) with the most recent timestamp.

```sql
LAST(field_expression)
```

#### Arguments

-   **field\_expression**: Expression to identify one or more fields to operate on. Can be a [field key](/influxdb3/enterprise/reference/glossary/#field-key), constant, regular expression, or wildcard (`*`). Supports all field [data types](/influxdb/v2/query-data/influxql/explore-data/select/#data-types).

#### Notable behaviors

-   `LAST()` [overrides original timestamps when grouping by time](#timestamps-when-grouping-by-time)

#### Examples

[](#select-the-last-value-for-a-field)

Select the last value for a field

```sql
SELECT LAST(temp) FROM home
```

name: home

| time | last |
| --- | --- |
| 2022-01-01T20:00:00Z | 22.7 |

[](#select-the-last-value-from-each-field)

Select the last value from each field

```sql
SELECT LAST(*) FROM home
```

name: home

| time | last_co | last_hum | last_temp |
| --- | --- | --- | --- |
| 1970-01-01T00:00:00Z | 26 | 36.5 | 22.7 |

[](#select-the-last-value-from-field-keys-that-match-a-regular-expression)

Select the last value from field keys that match a regular expression

```sql
SELECT LAST(/^[th]/) FROM home
```

name: home

| time | last_hum | last_temp |
| --- | --- | --- |
| 1970-01-01T00:00:00Z | 36.5 | 22.7 |

[](#select-the-last-value-from-a-field-within-time-windows-grouped-by-time)

Select the last value from a field within time windows (grouped by time)

```sql
SELECT
  LAST(temp)
FROM home 
WHERE
  room = 'Kitchen'
  AND time >= '2022-01-01T08:00:00Z'
  AND time <= '2022-01-01T20:00:00Z'
GROUP BY time(6h)
```

name: home

| time | last |
| --- | --- |
| 2022-01-01T06:00:00Z | 22.4 |
| 2022-01-01T12:00:00Z | 22.7 |
| 2022-01-01T18:00:00Z | 22.7 |

Notice that when grouping by time, `LAST()` [overrides the point’s original timestamp](#timestamps-when-grouping-by-time).

## MAX()

Returns the greatest [field value](/influxdb3/enterprise/reference/glossary/#field-value).

```sql
MAX(field_expression)
```

#### Arguments

-   **field\_expression**: Expression to identify one or more fields to operate on. Can be a [field key](/influxdb3/enterprise/reference/glossary/#field-key), constant, regular expression, or wildcard (`*`). Supports **numeric fields**.

#### Notable behaviors

-   `MAX()` [overrides original timestamps when grouping by time](#timestamps-when-grouping-by-time).

#### Examples

[](#select-the-maximum-value-from-a-field)

Select the maximum value from a field

```sql
SELECT MAX(co) FROM home
```

name: home

| time | max |
| --- | --- |
| 2022-01-01T20:00:00Z | 26 |

[](#select-the-maximum-value-from-each-field)

Select the maximum value from each field

```sql
SELECT MAX(*) FROM home
```

name: home

| time | max_co | max_hum | max_temp |
| --- | --- | --- | --- |
| 1970-01-01T00:00:00Z | 26 | 36.9 | 23.3 |

[](#select-the-maximum-value-from-field-keys-that-match-a-regular-expression)

Select the maximum value from field keys that match a regular expression

```sql
SELECT MAX(/^[th]/) FROM home
```

name: home

| time | max_hum | max_temp |
| --- | --- | --- |
| 1970-01-01T00:00:00Z | 36.9 | 23.3 |

[](#select-the-maximum-value-from-a-field-within-time-windows-grouped-by-time)

Select the maximum value from a field within time windows (grouped by time)

```sql
SELECT
  MAX(temp)
FROM home
WHERE
  room = 'Kitchen'
  AND time >= '2022-01-01T08:00:00Z'
  AND time <= '2022-01-01T20:00:00Z'
GROUP BY time(6h)
```

name: home

| time | max |
| --- | --- |
| 2022-01-01T06:00:00Z | 23 |
| 2022-01-01T12:00:00Z | 22.8 |
| 2022-01-01T18:00:00Z | 23.3 |

Notice that when grouping by time, `MAX()` [overrides the point’s original timestamp](#timestamps-when-grouping-by-time).

## MIN()

Returns the lowest [field value](/influxdb3/enterprise/reference/glossary/#field-value).

```sql
MIN(field_expression)
```

#### Arguments

-   **field\_expression**: Expression to identify one or more fields to operate on. Can be a [field key](/influxdb3/enterprise/reference/glossary/#field-key), constant, regular expression, or wildcard (`*`). Supports **numeric fields**.

#### Notable behaviors

-   `MIN()` [overrides original timestamps when grouping by time](#timestamps-when-grouping-by-time).

#### Examples

[](#select-the-minimum-value-from-a-field)

Select the minimum value from a field

```sql
SELECT MIN(temp) FROM home
```

name: home

| time | min |
| --- | --- |
| 2022-01-01T08:00:00Z | 21 |

[](#select-the-minimum-value-from-each-field)

Select the minimum value from each field

```sql
SELECT MIN(*) FROM home
```

name: home

| time | min_co | min_hum | min_temp |
| --- | --- | --- | --- |
| 1970-01-01T00:00:00Z | 0 | 35.9 | 21 |

[](#select-the-minimum-value-from-field-keys-that-match-a-regular-expression)

Select the minimum value from field keys that match a regular expression

```sql
SELECT MIN(/^[th]/) FROM home
```

name: home

| time | min_hum | min_temp |
| --- | --- | --- |
| 1970-01-01T00:00:00Z | 35.9 | 21 |

[](#select-the-minimum-value-from-a-field-within-time-windows-grouped-by-time)

Select the minimum value from a field within time windows (grouped by time)

```sql
SELECT
  MIN(temp)
FROM home
WHERE
  room = 'Kitchen'
  AND time >= '2022-01-01T08:00:00Z'
  AND time <= '2022-01-01T20:00:00Z'
GROUP BY time(6h)
```

name: home

| time | min |
| --- | --- |
| 2022-01-01T06:00:00Z | 21 |
| 2022-01-01T12:00:00Z | 22.4 |
| 2022-01-01T18:00:00Z | 22.7 |

Notice that when grouping by time, `MIN()` [overrides the point’s original timestamp](#timestamps-when-grouping-by-time).

## PERCENTILE()

Returns the `N`th percentile [field value](/influxdb3/enterprise/reference/glossary/#field-value).

```sql
PERCENTILE(field_expression, N)
```

#### Arguments

-   **field\_expression**: Expression to identify one or more fields to operate on. Can be a [field key](/influxdb3/enterprise/reference/glossary/#field-key), constant, regular expression, or wildcard (`*`). Supports **numeric fields**.
-   **N**: Percentile to return. Must be an integer or float value **greater than 0 and less than or equal to 100**.

#### Notable behaviors

-   `PERCENTILE()` [overrides original timestamps when grouping by time](#timestamps-when-grouping-by-time).
-   `PERCENTILE(example_field, 100)` is equivalent to [`MAX(example_field)`](#max).
-   `PERCENTILE(example_field, 50)` is nearly equivalent to [`MEDIAN(example_field)`](/influxdb3/enterprise/reference/influxql/functions/aggregates/#median), except `MEDIAN()` returns the average of the two middle values if the field contains an even number of values.
-   `PERCENTILE(example_field, 0)` returns *null*.

#### Examples

[](#select-the-50th-percentile-value-from-a-field)

Select the 50th percentile value from a field

```sql
SELECT PERCENTILE(temp, 50) FROM home
```

name: home

| time | percentile |
| --- | --- |
| 2022-01-01T11:00:00Z | 22.4 |

[](#select-the-50th-percentile-value-from-each-field)

Select the 50th percentile value from each field

```sql
SELECT PERCENTILE(*, 50) FROM home
```

name: home

| time | percentile_co | percentile_hum | percentile_temp |
| --- | --- | --- | --- |
| 1970-01-01T00:00:00Z | 1 | 36 | 22.4 |

[](#select-the-50th-percentile-value-from-field-keys-that-match-a-regular-expression)

Select the 50th percentile value from field keys that match a regular expression

```sql
SELECT PERCENTILE(/^[th]/, 50) FROM home
```

name: home

| time | percentile_hum | percentile_temp |
| --- | --- | --- |
| 1970-01-01T00:00:00Z | 36 | 22.4 |

[](#select-the-50th-percentile-value-from-a-field-within-time-windows-grouped-by-time)

Select the 50th percentile value from a field within time windows (grouped by time)

```sql
SELECT
  PERCENTILE(temp, 50)
FROM home
WHERE
  room = 'Kitchen'
  AND time >= '2022-01-01T08:00:00Z'
  AND time <= '2022-01-01T20:00:00Z'
GROUP BY time(6h)
```

name: home

| time | percentile |
| --- | --- |
| 2022-01-01T06:00:00Z | 22.4 |
| 2022-01-01T12:00:00Z | 22.7 |
| 2022-01-01T18:00:00Z | 23.1 |

Notice that when grouping by time, `PERCENTILE()` [overrides the point’s original timestamp](#timestamps-when-grouping-by-time).

## TOP()

Returns the greatest `N` [field values](/influxdb3/enterprise/reference/glossary/#field-value). `TOP()` supports int64 and float64 field value [data types](/influxdb3/enterprise/reference/glossary/#field-value).

```sql
TOP(field_expression[, tag_expression_1[, ..., tag_expression_n]], N)
```

**Note:** `TOP()` returns the field value with the earliest timestamp if there’s a tie between two or more values for the greatest value.

#### Arguments

-   **field\_expression**: Expression to identify the field to operate on. Can be a [field key](/influxdb3/enterprise/reference/glossary/#field-key) or constant.
-   **tag\_expression**: Expression to identify a tag key to segment by. Can be a [tag key](/influxdb3/enterprise/reference/glossary/#tag-key) or constant. Comma-delimit multiple tags.
-   **N**: Number of results to return from each InfluxQL group or specified tag segment.

#### Notable behaviors

-   `TOP()` [maintains original timestamps when grouping by time](#timestamps-when-grouping-by-time).
-   `TOP()` [may return fewer points than expected](#selector-functions-may-return-fewer-points-than-expected).

#### Examples

[](#select-the-top-three-values-of-a-field)

Select the top three values of a field

```sql
SELECT TOP(temp, 3) FROM home
```

name: home

| time | top |
| --- | --- |
| 2022-01-01T09:00:00Z | 23 |
| 2022-01-01T18:00:00Z | 23.3 |
| 2022-01-01T19:00:00Z | 23.1 |

[](#select-the-top-field-value-for-two-unique-tag-values)

Select the top field value for two unique tag values

```sql
SELECT TOP(temp, room, 2) FROM home
```

name: home

| time | top | room |
| --- | --- | --- |
| 2022-01-01T18:00:00Z | 23.3 | Kitchen |
| 2022-01-01T18:00:00Z | 22.8 | Living Room |

[](#select-the-top-three-field-values-and-the-tag-value-associated-with-each)

Select the top three field values and the tag value associated with each

```sql
SELECT TOP(temp, 3), room FROM home
```

name: home

| time | top | room |
| --- | --- | --- |
| 2022-01-01T09:00:00Z | 23 | Kitchen |
| 2022-01-01T18:00:00Z | 23.3 | Kitchen |
| 2022-01-01T19:00:00Z | 23.1 | Kitchen |

[](#select-the-top-field-values-for-unique-tag-values-and-within-time-windows-grouped-by-time)

Select the top field values for unique tag values and within time windows (grouped by time)

```sql
SELECT
  TOP(temp, room, 2)
FROM home
WHERE
  time >= '2022-01-01T08:00:00Z'
  AND time <= '2022-01-01T12:00:00Z'
GROUP BY time(2h)
```

name: home

| time | top | room |
| --- | --- | --- |
| 2022-01-01T09:00:00Z | 23 | Kitchen |
| 2022-01-01T09:00:00Z | 21.4 | Living Room |
| 2022-01-01T10:00:00Z | 22.7 | Kitchen |
| 2022-01-01T11:00:00Z | 22.2 | Living Room |
| 2022-01-01T12:00:00Z | 22.5 | Kitchen |
| 2022-01-01T12:00:00Z | 22.2 | Living Room |

Notice that when grouping by time, `TOP()` [maintains the point’s original timestamp](#timestamps-when-grouping-by-time).

## Notable behaviors of selector functions

-   [Timestamps when grouping by time](#timestamps-when-grouping-by-time)
-   [Selector functions may return fewer points than expected](#selector-functions-may-return-fewer-points-than-expected)

### Timestamps when grouping by time

When using selector functions with a `GROUP BY time()` clause, most selector functions return the timestamp of the starting boundary for each time interval. However functions with an `N` argument that specifies the number of results to return per group maintain the original timestamp of each returned point.

###### Return the start time of each time interval

-   [FIRST()](#first)
-   [LAST()](#last)
-   [MAX()](#max)
-   [MIN()](#min)
-   [PERCENTILE()](#percentile)

###### Maintain the original timestamp

-   [BOTTOM()](#bottom)
-   [TOP()](#top)

### Selector functions may return fewer points than expected

Queries that use the following selector functions with an `N` argument may return fewer points than expected.

-   [BOTTOM()](#bottom)
-   [TOP()](#top)

If the InfluxQL group or specified tag key contains `X` points or unique tag values and `X` is less than `N`, the function returns `X` results instead of `N` for each group or tag value.

[](#view-example-for-fnfield_key-n)

View example for `FN(field_key, N)`

The example below selects the bottom 5 temperatures from the Kitchen between 2022-01-01T08:00:00Z and 2022-01-01T10:00:00Z. There are only 3 points recorded for the Kitchen during the queried time range, so the query returns 3 points instead of 5.

```sql
SELECT BOTTOM(temp, 5)
FROM home
WHERE
  time >= '2022-01-01T08:00:00Z'
  AND time <= '2022-01-01T10:00:00Z'
  AND room = 'Kitchen'
```

| time | bottom |
| --- | --- |
| 2022-01-01T08:00:00Z | 21 |
| 2022-01-01T09:00:00Z | 23 |
| 2022-01-01T10:00:00Z | 22.7 |

[](#view-example-for-fnfield_key-tag_key-n)

View example for `FN(field_key, tag_key, N)`

The example below selects the top temperature from 3 unique values of the `room` tag. However, the `room` tag only has 2 unique values, so results only contain 2 values.

```sql
SELECT TOP(temp, room, 3) FROM home
```

| time | top | room |
| --- | --- | --- |
| 2022-01-01T18:00:00Z | 23.3 | Kitchen |
| 2022-01-01T18:00:00Z | 22.8 | Living Room |

#### Related

-   [Aggregate data with InfluxQL](/influxdb3/enterprise/query-data/influxql/aggregate-select/)
