介绍

对于在离散状态之间切换的系统或值,聚合每个状态花费的时间量。例如,您可以使用 compact_state_agg 函数跟踪系统在 errorrunningstarting 状态下花费的时间。

compact_state_agg 旨在处理相对较少的状态。它可能无法在状态在行之间主要不同的数据集上很好地执行。

如果您需要跟踪每个状态何时进入和退出,请使用 state_agg 函数。如果您需要根据心跳信号跟踪系统的存活性,请考虑使用 heartbeat_agg 函数。

相关超函数组
警告

此函数组包含一些实验性函数。实验性函数可能会在将来的版本中更改或删除。我们不建议在生产环境中使用它们。实验性函数标记有**实验性**标签。

聚合

compact_state_agg
实验性将状态数据聚合到状态聚合中以进行进一步分析

访问器

duration_in
实验性从状态聚合中计算给定状态下花费的总时间
interpolated_duration_in
实验性从状态聚合中计算给定状态下花费的总时间,在时间桶边界处插入值
into_values
实验性将状态聚合扩展为一组行,显示每个状态的持续时间

汇总

rollup
实验性组合多个状态聚合
compact_state_agg(
ts TIMESTAMPTZ,
value {TEXT | BIGINT}
) RETURNS StateAgg

将包含状态数据的数据集聚合到状态聚合中以跟踪每个状态花费的时间。

必需参数
名称类型描述
tsTIMESTAMPTZ与每个状态读取相关的 timestamps
valueTEXTBIGINT此时的状态
返回
类型描述
aggStateAgg存储每个状态花费的总时间的对象
示例

创建一个状态聚合以跟踪某些设备的状态

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.

必需参数
名称类型描述
aggStateAgg使用 compact_state_agg 创建的状态聚合
stateTEXTBIGINT要查询的状态
可选参数
名称类型描述
startTIMESTAMPTZ如果指定,则仅返回此时间之后的状态时间。
intervalINTERVAL如果指定,则仅返回从开始时间到间隔结束的状态时间。
返回
类型描述
duration_inINTERVAL在给定状态下花费的时间。以dayshh:mm:ss 或两者的组合显示。
示例

创建一个测试表,跟踪系统何时在startingrunningerror 状态之间切换。查询该表以获取在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 不同,您可以跨覆盖多个时间桶的多个状态聚合使用此函数。时间桶边界处的任何缺失值都会从相邻状态聚合中插入。

必需参数
名称类型描述
aggStateAgg使用 compact_state_agg 创建的状态聚合
stateTEXTBIGINT要查询的状态
startTIMESTAMPTZ要计算的时间间隔的开始
intervalINTERVAL要计算的时间间隔的长度
可选参数
名称类型描述
prevStateAgg前一个时间间隔的状态聚合,用于在start 处插入值。如果为NULL,则aggregate 中的第一个 timestamp 将用作时间间隔的开始。
返回
类型描述
interpolated_duration_inINTERVAL在查询的状态中花费的总时间。以dayshh:mm:ss 或两者的组合显示。
示例

创建一个测试表,跟踪系统何时在startingrunningerror 状态之间切换。查询该表以获取在running 状态下花费的时间。使用LAGLEAD 获取用于插入的相邻聚合。如果您希望以秒为单位查看结果,请从返回的结果中 EXTRACT epoch

SELECT
time,
toolkit_experimental.interpolated_duration_in(
agg,
'running',
time,
'1 day',
LAG(agg) OVER (ORDER BY time)
) FROM (
SELECT
time_bucket('1 day', time) as time,
toolkit_experimental.compact_state_agg(time, state) as agg
FROM
states
GROUP BY time_bucket('1 day', time)
) s;
time | interpolated_duration_in
------------------------+--------------------------
2020-01-01 00:00:00+00 | 13:30:00
2020-01-02 00:00:00+00 | 16:00:00
2020-01-03 00:00:00+00 | 04:30:00
2020-01-04 00:00:00+00 | 12:00:00
into_values(
agg StateAgg
) RETURNS (TEXT, INTERVAL)
into_int_values(
agg StateAgg
) RETURNS (INT, INTERVAL)

将状态聚合解包到一组具有两列的行中,显示每个状态的持续时间。默认情况下,列名为stateduration。您可以使用与重命名表相同的方法重命名它们。

必需参数
名称类型描述
aggStateAgg使用 compact_state_agg 创建的状态聚合
返回
类型描述
stateTEXTBIGINT在状态聚合中找到的状态
durationINTERVAL在该状态下花费的总时间
示例

从表states_test 中创建一个状态聚合。时间列名为timestate 列包含对应于系统不同状态的文本值。使用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:03
OK | 00:01:46
START | 00:00:11
rollup(
agg StateAgg
) RETURNS StateAgg

将多个状态聚合组合成单个状态聚合。例如,您可以使用rollup将 15 分钟间隔内的状态聚合组合成每日间隔。

必需参数
名称类型描述
aggStateAgg使用compact_state_agg创建的状态聚合
返回
类型描述
aggStateAgg一个新的状态聚合,它将输入状态聚合组合在一起
示例

将多个状态聚合组合在一起,并计算在START状态下花费的持续时间

WITH buckets AS (SELECT
time_bucket('1 minute', ts) as dt,
toolkit_experimental.compact_state_agg(ts, state) AS sa
FROM states_test
GROUP BY time_bucket('1 minute', ts))
SELECT toolkit_experimental.duration_in(
'START',
toolkit_experimental.rollup(buckets.sa)
)
FROM buckets;

关键词

在这个页面上发现问题了吗?报告问题 或 在 GitHub 上编辑此页面