tdigest() 函数
ToolkitTimescaleDB Toolkit 函数在 Timescale 社区版中可用。它们已自动包含在 Timescale 中,但对于自托管的 TimescaleDB,必须单独安装。点击了解更多。Timescale Cloud:性能、规模、企业级
自托管产品
MST
简介
使用 t-digest 算法估计给定百分位数的值,或给定值的百分位排名。与使用 PostgreSQL 的 percentile_cont
和 percentile_disc
函数进行精确计算相比,这种估算在内存和 CPU 方面更高效。
tdigest
是 TimescaleDB Toolkit 中提供的两种高级百分位数近似聚合之一。它是一种空间高效的聚合方法,并且在极端分位数处提供比传统方法更准确的估计。
tdigest
在某种程度上依赖于输入顺序。如果 tdigest
对以不同顺序排列的相同数据运行,结果应该几乎相等,但不太可能完全相同。
另一种高级百分位数近似聚合是 uddsketch
,它能在保证相对误差的范围内产生稳定的估计。如果你不确定使用哪种方法,请尝试默认的百分位数估计方法 percentile_agg
。它使用 uddsketch
算法并带有一些合理的默认值。
有关百分位数近似算法的更多信息,请参阅算法概述。
相关超函数组
聚合函数
- tdigest
- 在
tdigest
中聚合数据,以便进一步计算百分位数估计
访问器函数
- approx_percentile
- 从
tdigest
估计给定百分位数的值 - approx_percentile_rank
- 从
tdigest
估计给定值的百分位数 - mean
- 从
tdigest
中的值计算精确的平均值 - num_vals
- 获取
tdigest
中包含的值的数量
汇总函数
- rollup
- 汇总多个
tdigest
tdigest(buckets INTEGER,value DOUBLE PRECISION) RETURNS TDigest
这是使用 tdigest
算法计算近似百分位数的第一步。使用 tdigest
从原始数据创建中间聚合。然后,此中间形式可由本组中的一个或多个访问器用于计算最终结果。
可选地,在应用访问器之前,可以使用 rollup()
组合多个此类中间聚合对象。
所需参数
名称 | 类型 | 描述 |
---|---|---|
buckets | INTEGER | 摘要中的桶数。增加此值可提供更准确的分位数估计,但需要更多内存。 |
value | DOUBLE PRECISION | 要为 tdigest 对象聚合的值列。 |
返回
列 | 类型 | 描述 |
---|---|---|
tdigest | TDigest | 使用 tdigest 算法创建的用于计算百分位数的百分位数估计器对象 |
示例
给定一个名为 samples
的表,其中有一个名为 data
的列,使用 data
列构建一个 tdigest
。使用 100 个桶进行近似计算。
SELECT tdigest(100, data) FROM samples;
approx_percentile(percentile DOUBLE PRECISION,tdigest TDigest) RETURNS DOUBLE PRECISION
从 tdigest
聚合中估计某个百分位数的近似值。
所需参数
名称 | 类型 | 描述 |
---|---|---|
percentile | DOUBLE PRECISION | 要计算的百分位数。必须在 [0.0, 1.0] 范围内。 |
tdigest | TDigest | tdigest 聚合。 |
返回
列 | 类型 | 描述 |
---|---|---|
approx_percentile | DOUBLE PRECISION | 在请求百分位数处的估计值。 |
示例
给定一个包含从 0 到 100 的数字的样本,估计第一个百分位数的值
SELECTapprox_percentile(0.01, tdigest(data))FROM generate_series(0, 100) data;
approx_percentile-------------------0.999
approx_percentile_rank(value DOUBLE PRECISION,digest TDigest) RETURNS DOUBLE PRECISION
估计给定值所处的百分位数。
所需参数
名称 | 类型 | 描述 |
---|---|---|
value | DOUBLE PRECISION | 要估计其百分位数的值。 |
digest | TDigest | tdigest 聚合。 |
返回
列 | 类型 | 描述 |
---|---|---|
approx_percentile_rank | DOUBLE PRECISION | 与提供的值相关联的估计百分位数。 |
示例
给定一个包含从 0 到 100 的数字的样本,估计值 99
的百分位排名
SELECTapprox_percentile_rank(99, tdigest(data))FROM generate_series(0, 100) data;
approx_percentile_rank----------------------------0.9851485148514851
mean(digest TDigest) RETURNS DOUBLE PRECISION
计算 tdigest
聚合中值的精确平均值。与百分位数计算不同,平均值计算是精确的。此访问器允许您在计算百分位数的同时计算平均值,而无需从相同的原始数据创建两个单独的聚合。
所需参数
名称 | 类型 | 描述 |
---|---|---|
digest | TDigest | 从中提取平均值的 tdigest 聚合。 |
返回
列 | 类型 | 描述 |
---|---|---|
mean | DOUBLE PRECISION | tdigest 聚合中值的平均值。 |
示例
计算从 0 到 100 的整数的平均值
SELECT mean(tdigest(data))FROM generate_series(0, 100) data;
mean------50
num_vals(digest TDigest) RETURNS DOUBLE PRECISION
获取 tdigest
聚合中包含的值的数量。此访问器允许您在计算百分位数的同时计算数量,而无需从相同的原始数据创建两个单独的聚合。
所需参数
名称 | 类型 | 描述 |
---|---|---|
digest | TDigest | 从中提取值数量的 tdigest 聚合。 |
返回
列 | 类型 | 描述 |
---|---|---|
num_vals | DOUBLE PRECISION | tdigest 聚合中值的数量。 |
示例
计数从 0 到 100 的整数数量
SELECT num_vals(tdigest(data))FROM generate_series(0, 100) data;
num_vals-----------101
rollup(digest TDigest) RETURNS TDigest
将由 tdigest
生成的多个中间 tdigest
聚合组合成一个单一的中间 tdigest
聚合。例如,您可以使用 rollup
将来自 15 分钟桶的 tdigest
组合成每日桶。
所需参数
名称 | 类型 | 描述 |
---|---|---|
digest | TDigest | 要汇总的 tdigest 。 |
返回
列 | 类型 | 描述 |
---|---|---|
rollup | TDigest | 通过组合输入 tdigest 创建的新 tdigest 。 |
创建一个包含百分位数聚合的每小时连续聚合
CREATE MATERIALIZED VIEW foo_hourlyWITH (timescaledb.continuous)AS SELECTtime_bucket('1 h'::interval, ts) as bucket,tdigest(value) as tdigestFROM fooGROUP BY 1;
您可以使用访问器直接从连续聚合中查询每小时数据。您还可以将每小时数据汇总到每日桶中,然后计算近似百分位数。
SELECTtime_bucket('1 day'::interval, bucket) as bucket,approx_percentile(0.95, rollup(tdigest)) as p95,approx_percentile(0.99, rollup(tdigest)) as p99FROM foo_hourlyGROUP BY 1;
关键词
在此页面上发现问题?报告问题 或 在 GitHub 上编辑此页面
。