---
title: Calculate the rate of change
description: Use derivative() to calculate the rate of change between subsequent values or aggregate.rate() to calculate the average rate of change per window of time. If time between points varies, these functions normalize points to a common time interval making values easily comparable.
url: https://docs.influxdata.com/influxdb/v2/query-data/flux/rate/
estimated_tokens: 2936
product: InfluxDB OSS v2
version: v2
---

# Calculate the rate of change

This page documents an earlier version of InfluxDB OSS. [InfluxDB 3 Core](/influxdb3/core/) is the latest stable version.

#### API token hashing is enabled by default in InfluxDB OSS 2.9.0

Stronger token security: tokens are stored as hashes on disk, so a copy of the database file doesn’t expose usable tokens. Existing tokens are hashed on first startup and the original strings can’t be recovered afterward — **capture any plaintext tokens you still need before you upgrade**.

For more information, see [Token hashing](/influxdb/v2/admin/tokens/#token-hashing).

Use [`derivative()`](/flux/v0/stdlib/universe/derivative/) to calculate the rate of change between subsequent values or [`aggregate.rate()`](/flux/v0/stdlib/experimental/aggregate/rate/) to calculate the average rate of change per window of time. If time between points varies, these functions normalize points to a common time interval making values easily comparable.

-   [Rate of change between subsequent values](#rate-of-change-between-subsequent-values)
-   [Average rate of change per window of time](#average-rate-of-change-per-window-of-time)

## Rate of change between subsequent values

Use the [`derivative()` function](/flux/v0/stdlib/universe/derivative/) to calculate the rate of change per unit of time between subsequent *non-null* values.

```js
data
    |> derivative(unit: 1s)
```

By default, `derivative()` returns only positive derivative values and replaces negative values with *null*. Calculated values are returned as [floats](/flux/v0/spec/types/#numeric-types).

**Given the following input:**

| _time | _value |
| --- | --- |
| 2020-01-01T00:00:00Z | 250 |
| 2020-01-01T00:04:00Z | 160 |
| 2020-01-01T00:12:00Z | 150 |
| 2020-01-01T00:19:00Z | 220 |
| 2020-01-01T00:32:00Z | 200 |
| 2020-01-01T00:51:00Z | 290 |
| 2020-01-01T01:00:00Z | 340 |

**`derivative(unit: 1m)` returns:**

| _time | _value |
| --- | --- |
| 2020-01-01T00:04:00Z |  |
| 2020-01-01T00:12:00Z |  |
| 2020-01-01T00:19:00Z | 10.0 |
| 2020-01-01T00:32:00Z |  |
| 2020-01-01T00:51:00Z | 4.74 |
| 2020-01-01T01:00:00Z | 5.56 |

Results represent the rate of change **per minute** between subsequent values with negative values set to *null*.

### Return negative derivative values

To return negative derivative values, set the `nonNegative` parameter to `false`,

**Given the following input:**

| _time | _value |
| --- | --- |
| 2020-01-01T00:00:00Z | 250 |
| 2020-01-01T00:04:00Z | 160 |
| 2020-01-01T00:12:00Z | 150 |
| 2020-01-01T00:19:00Z | 220 |
| 2020-01-01T00:32:00Z | 200 |
| 2020-01-01T00:51:00Z | 290 |
| 2020-01-01T01:00:00Z | 340 |

**The following returns:**

```js
|> derivative(unit: 1m, nonNegative: false)
```

| _time | _value |
| --- | --- |
| 2020-01-01T00:04:00Z | -22.5 |
| 2020-01-01T00:12:00Z | -1.25 |
| 2020-01-01T00:19:00Z | 10.0 |
| 2020-01-01T00:32:00Z | -1.54 |
| 2020-01-01T00:51:00Z | 4.74 |
| 2020-01-01T01:00:00Z | 5.56 |

Results represent the rate of change **per minute** between subsequent values and include negative values.

## Average rate of change per window of time

Use the [`aggregate.rate()` function](/flux/v0/stdlib/experimental/aggregate/rate/) to calculate the average rate of change per window of time.

```js
import "experimental/aggregate"

data
    |> aggregate.rate(
        every: 1m,
        unit: 1s,
        groupColumns: ["tag1", "tag2"],
    )
```

`aggregate.rate()` returns the average rate of change (as a [float](/flux/v0/spec/types/#numeric-types)) per `unit` for time intervals defined by `every`. Negative values are replaced with *null*.

`aggregate.rate()` does not support `nonNegative: false`.

**Given the following input:**

| _time | _value |
| --- | --- |
| 2020-01-01T00:00:00Z | 250 |
| 2020-01-01T00:04:00Z | 160 |
| 2020-01-01T00:12:00Z | 150 |
| 2020-01-01T00:19:00Z | 220 |
| 2020-01-01T00:32:00Z | 200 |
| 2020-01-01T00:51:00Z | 290 |
| 2020-01-01T01:00:00Z | 340 |

**The following returns:**

```js
|> aggregate.rate(
    every: 20m,
    unit: 1m,
)
```

| _time | _value |
| --- | --- |
| 2020-01-01T00:20:00Z | 10.00 |
| 2020-01-01T00:40:00Z |  |
| 2020-01-01T01:00:00Z | 4.74 |
| 2020-01-01T01:20:00Z | 5.56 |

Results represent the **average change rate per minute** of every **20 minute interval** with negative values set to *null*. Timestamps represent the right bound of the time window used to average values.

#### Related

-   [derivative() function](/flux/v0/stdlib/universe/derivative/)
-   [aggregate.rate() function](/flux/v0/stdlib/experimental/aggregate/rate/)

[query](/influxdb/v2/tags/query/) [rate](/influxdb/v2/tags/rate/)
