# TS.CREATERULE Create a compaction rule [Examples](#examples) ## Required arguments
sourceKey is key name for the source time series.
destKey is key name for destination (compacted) time series. It must be created before `TS.CREATERULE` is called.
AGGREGATION aggregator bucketDuration aggregates results into time buckets. - `aggregator` takes one of the following aggregation types: | `aggregator` | Description | | ------------ | ------------------------------------------------------------------------------ | | `avg` | Arithmetic mean of all values | | `sum` | Sum of all values | | `min` | Minimum value | | `max` | Maximum value | | `range` | Difference between the highest and the lowest value | | `count` | Number of values | | `first` | Value with lowest timestamp in the bucket | | `last` | Value with highest timestamp in the bucket | | `std.p` | Population standard deviation of the values | | `std.s` | Sample standard deviation of the values | | `var.p` | Population variance of the values | | `var.s` | Sample variance of the values | | `twa` | Time-weighted average over the bucket's timeframe (since RedisTimeSeries v1.8) | - `bucketDuration` is duration of each bucket, in milliseconds. Notes - Only new samples that are added into the source series after the creation of the rule will be aggregated. - Calling `TS.CREATERULE` with a nonempty `destKey` may result in inconsistencies between the raw and the compacted data. - Explicitly adding samples to a compacted time series (using [`TS.ADD`](https://redis.io/docs/latestcommands/ts.add/), [`TS.MADD`](https://redis.io/docs/latestcommands/ts.madd/), [`TS.INCRBY`](https://redis.io/docs/latestcommands/ts.incrby/), or [`TS.DECRBY`](https://redis.io/docs/latestcommands/ts.decrby/)) may result in inconsistencies between the raw and the compacted data. The compaction process may override such samples. - If no samples are added to the source time series during a bucket period. no _compacted sample_ is added to the destination time series. - The timestamp of a compacted sample added to the destination time series is set to the start timestamp the appropriate compaction bucket. For example, for a 10-minute compaction bucket with no alignment, the compacted samples timestamps are `x:00`, `x:10`, `x:20`, and so on. - Deleting `destKey` will cause the compaction rule to be deleted as well. In a clustered environment, you must use [hash tags](https://redis.io/docs/latest/operate/oss_and_stack/reference/cluster-spec#hash-tags) to force `sourceKey` and `destKey` to be stored in the same hash slot. If you don't, Redis may fail to compact the data without displaying any error messages. ## Optional arguments
alignTimestamp (since RedisTimeSeries v1.8) ensures that there is a bucket that starts exactly at `alignTimestamp` and aligns all other buckets accordingly. It is expressed in milliseconds. The default value is 0: aligned with the Unix epoch. For example, if `bucketDuration` is 24 hours (`24 * 3600 * 1000`), setting `alignTimestamp` to 6 hours after the Unix epoch (`6 * 3600 * 1000`) ensures that each bucket’s timeframe is `[06:00 .. 06:00)`.
## Return value Returns one of these replies: - [Simple string reply](https://redis.io/docs/latest/develop/reference/protocol-spec#simple-strings) - `OK` if executed correctly - [] on error (invalid arguments, wrong key type, etc.), when `sourceKey` does not exist, when `destKey` does not exist, when `sourceKey` is already a destination of a compaction rule, when `destKey` is already a source or a destination of a compaction rule, or when `sourceKey` and `destKey` are identical ## Examples
Create a compaction rule Create a time series to store the temperatures measured in Tel Aviv. 127.0.0.1:6379> TS.CREATE temp:TLV LABELS type temp location TLV OK Next, create a compacted time series named _dailyAvgTemp_ containing one compacted sample per 24 hours: the time-weighted average of all measurements taken from midnight to next midnight. 127.0.0.1:6379> TS.CREATE dailyAvgTemp:TLV LABELS type temp location TLV 127.0.0.1:6379> TS.CREATERULE temp:TLV dailyAvgTemp:TLV AGGREGATION twa 86400000 Now, also create a compacted time series named _dailyDiffTemp_. This time series will contain one compacted sample per 24 hours: the difference between the minimum and the maximum temperature measured between 06:00 and 06:00 next day. Here, 86400000 is the number of milliseconds in 24 hours, 21600000 is the number of milliseconds in 6 hours. 127.0.0.1:6379> TS.CREATE dailyDiffTemp:TLV LABELS type temp location TLV 127.0.0.1:6379> TS.CREATERULE temp:TLV dailyDiffTemp:TLV AGGREGATION range 86400000 21600000
## See also [`TS.DELETERULE`](https://redis.io/docs/latestcommands/ts.deleterule/) ## Related topics [RedisTimeSeries](https://redis.io/docs/latest/develop/data-types/timeseries/)