uddsketch()和 percentile_agg()函数
工具包TimescaleDB 工具包函数在 Timescale 社区版中可用。它们会自动包含在 Timescale 中,但对于自托管的 TimescaleDB 必须单独安装。单击以了解更多信息。简介
使用 UddSketch 算法估算给定百分位数的值,或给定值的百分位数排名。与使用 PostgreSQL 的 percentile_cont
和 percentile_disc
函数进行精确计算相比,这种估算更节省内存和 CPU。
uddsketch
是 TimescaleDB 工具包中提供的两个高级百分位数近似聚合之一。它在保证的相对误差范围内生成稳定的估计。
另一个高级百分位数近似聚合是 tdigest
,它在极端分位数方面更准确,但对输入顺序有一定的依赖性。
如果您不确定使用哪个聚合函数,请尝试使用默认的百分位数估计方法,percentile_agg
。它使用 uddsketch
算法,并使用了一些合理的默认值。
有关百分位数近似算法的更多信息,请参阅 算法概述。
相关超函数组
聚合
- uddsketch
- 在
uddsketch
中聚合数据以供进一步计算百分位数估计
备用聚合
- percentile_agg
- 在 uddsketch 中聚合数据,使用一些合理的默认值,以供进一步计算百分位数估计
访问器
- approx_percentile
- 从
uddsketch
中估算给定百分位数的值 - approx_percentile_array
- 从
uddsketch
中估算给定百分位数数组的值 - approx_percentile_rank
- 从
uddsketch
中估算给定值的百分位数 - error
- 获取
uddsketch
的最大相对误差 - mean
- 从
uddsketch
中的值计算精确的平均值 - num_vals
- 获取
uddsketch
中包含的值的数量
汇总
- rollup
- 汇总多个
uddsketch
uddsketch(size INTEGER,max_error DOUBLE PRECISION,value DOUBLE PRECISION) RETURNS UddSketch
这是使用 uddsketch
算法计算近似百分位数的第一步。使用 uddsketch
从您的原始数据创建中间聚合。然后,可以使用此组中的一个或多个访问器来计算最终结果。
可选地,可以使用 rollup()
在应用访问器之前将多个这样的中间聚合对象组合在一起。
如果您不确定为 size
和 max_error
设置什么值,请尝试使用备用聚合函数,percentile_agg()
。percentile_agg
也创建了一个 UddSketch
,但它为 size
和 max_error
设置了一些合理的默认值,这些值应该适用于许多用例。
必需参数
名称 | 类型 | 描述 |
---|---|---|
size | INTEGER | uddsketch 中的最大桶数。在此提供更大的值可以使聚合更有可能保持所需的误差,但可能会增加内存使用量。 |
max_error | DOUBLE PRECISION | 草图所需的相对误差最大值。如果为数据分布提供的桶数太少,则实际误差可能会超过此值。您可以使用 error 函数获取实际误差。 |
value | DOUBLE PRECISION | 要聚合的列,以便进行进一步计算。 |
返回值
列 | 类型 | 描述 |
---|---|---|
uddsketch | UddSketch | 使用 uddsketch 算法创建的百分位数估计器对象,用于计算百分位数 |
示例
给定一个名为 samples
的表,其中包含一个名为 data
的列,使用 data
列构建一个 uddsketch
。使用最大 100 个桶和 0.01 的相对误差
SELECT uddsketch(100, 0.01, data) FROM samples;
percentile_agg(value DOUBLE PRECISION) RETURNS UddSketch
这是计算近似百分位数的另一种第一步。它通过使用一些合理的默认值来创建 UddSketch
,从而提供了一些额外的便利。在内部,它使用 200 个桶和 0.001 的最大误差率调用 uddsketch
。
使用 percentile_agg
从您的原始数据创建中间聚合。然后,可以使用此组中的一个或多个访问器来计算最终结果。
可选地,可以使用 rollup()
在应用访问器之前将多个这样的中间聚合对象组合在一起。
必需参数
名称 | 类型 | 描述 |
---|---|---|
value | DOUBLE PRECISION | 要聚合的值列,以便进行百分位数计算 |
返回值
列 | 类型 | 描述 |
---|---|---|
percentile_agg | UddSketch | 使用 UddSketch 算法创建的百分位数估计器对象,用于计算百分位数 |
示例
创建一个存储百分位数聚合对象的连续聚合。这些对象稍后可与多个访问器一起使用,以进行回顾性分析
CREATE MATERIALIZED VIEW foo_hourlyWITH (timescaledb.continuous)AS SELECTtime_bucket('1 h'::interval, ts) as bucket,percentile_agg(value) as pct_aggFROM fooGROUP BY 1;
approx_percentile(percentile DOUBLE PRECISION,uddsketch UddSketch) RETURNS DOUBLE PRECISION
从 uddsketch
聚合中估算近似百分位数的值。
必需参数
名称 | 类型 | 描述 |
---|---|---|
percentile | DOUBLE PRECISION | 要计算的百分位数。必须在 [0.0, 1.0] 范围内。 |
sketch | UddSketch | uddsketch 聚合。 |
返回值
列 | 类型 | 描述 |
---|---|---|
approx_percentile | DOUBLE PRECISION | 请求百分位数的估计值。 |
示例
估算第一个百分位数的值,给定一个包含从 0 到 100 的数字的样本
SELECTapprox_percentile(0.01, uddsketch(data))FROM generate_series(0, 100) data;
approx_percentile-------------------0.999
approx_percentile_array(percentiles DOUBLE PRECISION[],uddsketch UddSketch) RETURNS DOUBLE PRECISION[]
从 uddsketch
聚合中估算百分位数数组的近似值。
必需参数
名称 | 类型 | 描述 |
---|---|---|
percentiles | DOUBLE PRECISION[] | 要计算的百分位数数组。必须在 [0.0, 1.0] 范围内。 |
sketch | UddSketch | uddsketch 聚合。 |
返回值
列 | 类型 | 描述 |
---|---|---|
approx_percentile_array | DOUBLE PRECISION[] | 请求百分位数的估计值。 |
示例
估算第 90、50 和 20 个百分位数的值,给定一个包含从 0 到 100 的数字的样本
SELECTapprox_percentile_array(array[0.9,0.5,0.2], uddsketch(100,0.005,data))FROM generate_series(0, 100) data;
approx_percentile_array-------------------{90.0,50.0,20.0}
approx_percentile_rank(value DOUBLE PRECISION,sketch UddSketch) RETURNS DOUBLE PRECISION
估算给定值将位于的百分位数。
必需参数
名称 | 类型 | 描述 |
---|---|---|
value | DOUBLE PRECISION | 要估算百分位数的值。 |
sketch | UddSketch | uddsketch 聚合。 |
返回值
列 | 类型 | 描述 |
---|---|---|
approx_percentile_rank | DOUBLE PRECISION | 与提供的价值相关的估计百分位数。 |
示例
估算值 99
的百分位数排名,给定一个包含从 0 到 100 的数字的样本
SELECTapprox_percentile_rank(99, uddsketch(data))FROM generate_series(0, 100) data;
approx_percentile_rank----------------------------0.9851485148514851
error(sketch UddSketch) RETURNS DOUBLE PRECISION
获取 uddsketch
的最大相对误差。正确的(非估计)百分位数落在 approx_percentile(sketch) +/- (approx_percentile(sketch) * error(sketch))
定义的范围内。
必需参数
名称 | 类型 | 描述 |
---|---|---|
sketch | UddSketch | 要确定其误差的 uddsketch 。 |
返回值
列 | 类型 | 描述 |
---|---|---|
error | DOUBLE PRECISION | 任何百分位数估计的最大相对误差。 |
示例
使用 uddsketch
估算百分位数时计算最大相对误差
SELECT error(uddsketch(data))FROM generate_series(0, 100) data;
error-------0.001
mean(sketch UddSketch) RETURNS DOUBLE PRECISION
计算 uddsketch
中的值的精确平均值。与百分位数计算不同,平均值计算是精确的。此访问器允许您在不从相同原始数据创建两个单独的聚合的情况下,与百分位数一起计算平均值。
必需参数
名称 | 类型 | 描述 |
---|---|---|
sketch | UddSketch | 要从中提取平均值的 uddsketch 。 |
返回值
列 | 类型 | 描述 |
---|---|---|
mean | DOUBLE PRECISION | uddsketch 中值的平均值。 |
示例
计算从 0 到 100 的整数的平均值
SELECT mean(uddsketch(data))FROM generate_series(0, 100) data;
mean------50
num_vals(sketch UddSketch) RETURNS DOUBLE PRECISION
获取 uddsketch
中包含的值的数量。此访问器允许您在不从相同原始数据创建两个单独的聚合的情况下,与百分位数一起计算计数。
必需参数
名称 | 类型 | 描述 |
---|---|---|
sketch | UddSketch | 要从中提取值数量的 uddsketch 。 |
返回值
列 | 类型 | 描述 |
---|---|---|
num_vals | DOUBLE PRECISION | uddsketch 中的值的数量。 |
示例
计算从 0 到 100 的整数的数量
SELECT num_vals(uddsketch(data))FROM generate_series(0, 100) data;
num_vals-----------101
rollup(sketch UddSketch) RETURNS UddSketch
将 uddsketch
生成的多个中间 uddsketch
聚合组合到单个中间 uddsketch
聚合中。例如,您可以使用 rollup
将 15 分钟桶中的 uddsketch
组合到每日桶中。
必需参数
名称 | 类型 | 描述 |
---|---|---|
sketch | UddSketch | 要汇总的 uddsketch 聚合。 |
返回值
列 | 类型 | 描述 |
---|---|---|
rollup | UddSketch | 通过组合输入 uddsketch 聚合创建的新 uddsketch 聚合。 |
创建一个包含百分位数聚合的每小时连续聚合
CREATE MATERIALIZED VIEW foo_hourlyWITH (timescaledb.continuous)AS SELECTtime_bucket('1 h'::interval, ts) as bucket,percentile_agg(value) as pct_aggFROM fooGROUP BY 1;
您可以使用访问器直接从连续聚合中查询每小时数据。您还可以将每小时数据汇总到每日桶中,然后计算近似百分位数
SELECTtime_bucket('1 day'::interval, bucket) as bucket,approx_percentile(0.95, rollup(pct_agg)) as p95,approx_percentile(0.99, rollup(pct_agg)) as p99FROM foo_hourlyGROUP BY 1;
创建一个包含百分位数聚合的每小时连续聚合
CREATE MATERIALIZED VIEW foo_hourlyWITH (timescaledb.continuous)AS SELECTtime_bucket('1 h'::interval, ts) as bucket,uddsketch(value) as uddsketchFROM fooGROUP BY 1;
您可以使用访问器直接从连续聚合中查询每小时数据。您还可以将每小时数据汇总到每日桶中,然后计算近似百分位数
SELECTtime_bucket('1 day'::interval, bucket) as bucket,approx_percentile(0.95, rollup(uddsketch)) as p95,approx_percentile(0.99, rollup(uddsketch)) as p99FROM foo_hourlyGROUP BY 1;
关键词
在本页面上发现问题了吗?报告问题或在 GitHub 上编辑此页面。