compact_state_agg() 函数
工具包TimescaleDB 工具包函数在 Timescale 社区版中可用。它们已自动包含在 Timescale 中,但对于自托管 TimescaleDB,必须单独安装。点击了解更多。Timescale Cloud:性能、规模、企业级
自托管产品
MST
简介
给定一个在离散状态之间切换的系统或值,聚合在每个状态中花费的时间量。例如,您可以使用 `compact_state_agg` 函数来跟踪系统在 `error`(错误)、`running`(运行中)或 `starting`(启动中)状态下花费了多少时间。
`compact_state_agg` 旨在处理相对较少的状态。对于状态在行之间大多不同的数据集,它的性能可能不佳。
如果您需要跟踪每个状态的进入和退出时间,请使用 `state_agg` 函数。如果您需要根据心跳信号跟踪系统的活跃性,请考虑使用 `heartbeat_agg` 函数。
相关超函数组
警告
此函数组包含一些实验性函数。实验性函数在未来的版本中可能会更改或删除。我们不建议在生产环境中使用它们。实验性函数标有“**实验性**”标签。
聚合器
- compact_state_agg
- 实验性将状态数据聚合到状态聚合中以进行进一步分析
访问器
- duration_in
- 实验性从状态聚合中计算在给定状态中花费的总时间
- interpolated_duration_in
- 实验性从状态聚合中计算在给定状态中花费的总时间,并在时间桶边界处插值
- into_values
- 实验性将状态聚合扩展为一组行,显示每个状态的持续时间
汇总器
compact_state_agg(ts TIMESTAMPTZ,value {TEXT | BIGINT}) RETURNS StateAgg
将包含状态数据的数据集聚合到状态聚合中,以跟踪在每个状态中花费的时间。
必需参数
名称 | 类型 | 描述 |
---|---|---|
ts | TIMESTAMPTZ | 与每个状态读取关联的时间戳 |
value | `TEXT`、`BIGINT` | 该时间点的状态 |
返回值
列 | 类型 | 描述 |
---|---|---|
agg | StateAgg | 存储每个状态总花费时间的对象 |
示例
创建状态聚合以跟踪某些设备的状态
SELECT toolkit_experimental.compact_state_agg(time, status) FROM devices;
duration_in(agg StateAgg,state {TEXT | BIGINT}[, start TIMESTAMPTZ][, interval INTERVAL]) RETURNS INTERVAL
给定一个状态聚合,计算在给定状态中花费的总时间。如果您需要在时间桶边界处插值缺失值,请使用 `interpolated_duration_in`。
必需参数
名称 | 类型 | 描述 |
---|---|---|
agg | StateAgg | 使用 `compact_state_agg` 创建的状态聚合 |
state | `TEXT`、`BIGINT` | 要查询的状态 |
可选参数
名称 | 类型 | 描述 |
---|---|---|
start | TIMESTAMPTZ | 如果指定,仅返回此时间之后在该状态中花费的时间。 |
interval | INTERVAL | 如果指定,仅返回从开始时间到间隔结束时在该状态中花费的时间。 |
返回值
列 | 类型 | 描述 |
---|---|---|
duration_in | INTERVAL | 在给定状态中花费的时间。显示为 `days`(天)、`hh:mm:ss`(时:分:秒)或两者的组合形式。 |
示例
创建一个测试表,用于跟踪系统在 `starting`(启动中)、`running`(运行中)和 `error`(错误)状态之间切换的时间。查询该表以获取在 `running` 状态中花费的时间。
如果您希望以秒为单位查看结果,请从返回结果中 `EXTRACT`(提取)纪元(epoch)。
SET timezone TO 'UTC';CREATE TABLE states(time TIMESTAMPTZ, state TEXT);INSERT INTO states VALUES('1-1-2020 10:00', 'starting'),('1-1-2020 10:30', 'running'),('1-3-2020 16:00', 'error'),('1-3-2020 18:30', 'starting'),('1-3-2020 19:30', 'running'),('1-5-2020 12:00', 'stopping');SELECT toolkit_experimental.duration_in(toolkit_experimental.compact_state_agg(time, state),'running') FROM states;
duration_in---------------3 days 22:00:00
interpolated_duration_in(agg StateAgg,state {TEXT | BIGINT},start TIMESTAMPTZ,interval INTERVAL[, prev StateAgg]) RETURNS DOUBLE PRECISION
计算在给定状态中的总持续时间。与 `duration_in` 不同,此函数可用于跨多个时间桶的多个状态聚合。时间桶边界处的任何缺失值都会从相邻的状态聚合中插值。
必需参数
名称 | 类型 | 描述 |
---|---|---|
agg | StateAgg | 使用 `compact_state_agg` 创建的状态聚合 |
state | `TEXT`、`BIGINT` | 要查询的状态 |
start | TIMESTAMPTZ | 要计算的时间间隔的开始 |
interval | INTERVAL | 要计算的时间间隔的长度 |
可选参数
名称 | 类型 | 描述 |
---|---|---|
prev | StateAgg | 前一个时间间隔的状态聚合,用于在 `start` 处插值。如果为 `NULL`,则 `aggregate` 中的第一个时间戳用作间隔的开始。 |
返回值
列 | 类型 | 描述 |
---|---|---|
interpolated_duration_in | INTERVAL | 在查询状态中花费的总时间。显示为 `days`(天)、`hh:mm:ss`(时:分:秒)或两者的组合形式。 |
示例
创建一个测试表,用于跟踪系统在 `starting`(启动中)、`running`(运行中)和 `error`(错误)状态之间切换的时间。查询该表以获取在 `running` 状态中花费的时间。使用 `LAG` 和 `LEAD` 获取相邻聚合进行插值。如果您希望以秒为单位查看结果,请从返回结果中 `EXTRACT`(提取)纪元(epoch)。
SELECTtime,toolkit_experimental.interpolated_duration_in(agg,'running',time,'1 day',LAG(agg) OVER (ORDER BY time)) FROM (SELECTtime_bucket('1 day', time) as time,toolkit_experimental.compact_state_agg(time, state) as aggFROMstatesGROUP BY time_bucket('1 day', time)) s;
time | interpolated_duration_in------------------------+--------------------------2020-01-01 00:00:00+00 | 13:30:002020-01-02 00:00:00+00 | 16:00:002020-01-03 00:00:00+00 | 04:30:002020-01-04 00:00:00+00 | 12:00:00
into_values(agg StateAgg) RETURNS (TEXT, INTERVAL)into_int_values(agg StateAgg) RETURNS (INT, INTERVAL)
将状态聚合解包为一组包含两列的行,显示每个状态的持续时间。默认情况下,列名为 `state` 和 `duration`。您可以使用与重命名表相同的方法重命名它们。
必需参数
名称 | 类型 | 描述 |
---|---|---|
agg | StateAgg | 使用 `compact_state_agg` 创建的状态聚合 |
返回值
列 | 类型 | 描述 |
---|---|---|
state | `TEXT`、`BIGINT` | 在状态聚合中找到的状态 |
duration | INTERVAL | 在该状态中花费的总时间 |
示例
从表 `states_test` 创建一个状态聚合。时间列名为 `time`,`state` 列包含与系统不同状态对应的文本值。使用 `into_values` 显示状态聚合中的数据。
SELECT state, duration FROM toolkit_experimental.into_values((SELECT toolkit_experimental.compact_state_agg(time, state) FROM states_test));
state | duration------+----------ERROR | 00:00:03OK | 00:01:46START | 00:00:11
rollup(agg StateAgg) RETURNS StateAgg
将多个状态聚合合并为一个单一状态聚合。例如,您可以使用 `rollup` 将来自 15 分钟桶的状态聚合合并为每日桶。
必需参数
名称 | 类型 | 描述 |
---|---|---|
agg | StateAgg | 使用 `compact_state_agg` 创建的状态聚合 |
返回值
列 | 类型 | 描述 |
---|---|---|
agg | StateAgg | 结合输入状态聚合的新状态聚合 |
示例
结合多个状态聚合并计算在 `START` 状态中花费的持续时间
WITH buckets AS (SELECTtime_bucket('1 minute', ts) as dt,toolkit_experimental.compact_state_agg(ts, state) AS saFROM states_testGROUP BY time_bucket('1 minute', ts))SELECT toolkit_experimental.duration_in('START',toolkit_experimental.rollup(buckets.sa))FROM buckets;
关键词
在此页面上发现问题?报告问题 或 在 GitHub 上编辑此页面
。