# Calculate the rate of change

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.

## Rate of change between subsequent values

Use the `derivative()` function to calculate the rate of change per unit of time between subsequent non-null values.

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

By default, `derivative()` returns only positive derivative values and replaces negative values with null. Calculated values are returned as floats.

Given the following input:

_time_value
2020-01-01T00:00:00Z250
2020-01-01T00:04:00Z160
2020-01-01T00:12:00Z150
2020-01-01T00:19:00Z220
2020-01-01T00:32:00Z200
2020-01-01T00:51:00Z290
2020-01-01T01:00:00Z340

`derivative(unit: 1m)` returns:

_time_value
2020-01-01T00:04:00Z
2020-01-01T00:12:00Z
2020-01-01T00:19:00Z10.0
2020-01-01T00:32:00Z
2020-01-01T00:51:00Z4.74
2020-01-01T01:00:00Z5.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:00Z250
2020-01-01T00:04:00Z160
2020-01-01T00:12:00Z150
2020-01-01T00:19:00Z220
2020-01-01T00:32:00Z200
2020-01-01T00:51:00Z290
2020-01-01T01:00:00Z340

The following returns:

``````|> 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:00Z10.0
2020-01-01T00:32:00Z-1.54
2020-01-01T00:51:00Z4.74
2020-01-01T01:00:00Z5.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 to calculate the average rate of change per window of time.

``````import "experimental/aggregate"

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

`aggregate.rate()` returns the average rate of change (as a float) 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:00Z250
2020-01-01T00:04:00Z160
2020-01-01T00:12:00Z150
2020-01-01T00:19:00Z220
2020-01-01T00:32:00Z200
2020-01-01T00:51:00Z290
2020-01-01T01:00:00Z340

The following returns:

``````|> aggregate.rate(
every: 20m,
unit: 1m,
)
``````
_time_value
2020-01-01T00:20:00Z10.00
2020-01-01T00:40:00Z
2020-01-01T01:00:00Z4.74
2020-01-01T01:20:00Z5.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.

### The future of Flux

Flux is going into maintenance mode. You can continue using it as you currently are without any changes to your code.

### InfluxDB v3 enhancements and InfluxDB Clustered is now generally available

New capabilities, including faster query performance and management tooling advance the InfluxDB v3 product line. InfluxDB Clustered is now generally available.

### InfluxDB v3 performance and features

The InfluxDB v3 product line has seen significant enhancements in query performance and has made new management tooling available. These enhancements include an operational dashboard to monitor the health of your InfluxDB cluster, single sign-on (SSO) support in InfluxDB Cloud Dedicated, and new management APIs for tokens and databases.

Learn about the new v3 enhancements

### InfluxDB Clustered general availability

InfluxDB Clustered is now generally available and gives you the power of InfluxDB v3 in your self-managed stack.

Talk to us about InfluxDB Clustered