简介

给定一个在离散状态之间切换的系统或值,聚合在每个状态中花费的时间量。例如,您可以使用 compact_state_agg 函数来跟踪系统在 errorrunningstarting 状态中花费了多少时间。

compact_state_agg 旨在与相对较少的状态一起工作。在状态在行之间大多不同的数据集上,它可能表现不佳。

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

相关 Hyperfunction 组
警告

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

聚合

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

访问器

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

汇总

rollup
Experimental合并多个状态聚合
compact_state_agg(
ts TIMESTAMPTZ,
value {TEXT | BIGINT}
) RETURNS StateAgg

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

必需参数
名称类型描述
tsTIMESTAMPTZ与每个状态读取关联的时间戳
valueTEXT, BIGINT该时间的状态
返回值
类型描述
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 创建的状态聚合
stateTEXT, BIGINT要查询的状态
可选参数
名称类型描述
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 创建的状态聚合
stateTEXT, BIGINT要查询的状态
startTIMESTAMPTZ要计算的时间间隔的开始
intervalINTERVAL要计算的时间间隔的长度
可选参数
名称类型描述
prevStateAgg来自先前时间间隔的状态聚合,用于插值 start 处的值。如果为 NULL,则 aggregate 中的第一个时间戳用作间隔的开始。
返回值
类型描述
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 创建的状态聚合
返回值
类型描述
stateTEXT, BIGINT在状态聚合中找到的状态
durationINTERVAL在该状态下花费的总时间
示例

从表 states_test 创建状态聚合。时间列名为 time,状态列包含与系统不同状态对应的文本值。使用 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 上编辑此页