quantileExactWeightedInterpolated
引入版本:v24.10.0
使用线性插值计算数值数据序列的分位数,并考虑每个元素的权重。
为了得到插值后的值,会先将所有传入的值合并到一个数组中,然后按照对应的权重排序。 接着,基于权重构建累积分布,并使用加权百分位数方法进行分位数插值,再结合权重和值通过线性插值计算分位数。
如果在同一个查询中使用多个 level 不同的 quantile* 函数,它们的内部状态不会合并 (也就是说,查询的执行效率会低于可达到的水平) 。
在这种情况下,请使用 quantiles 函数。
我们强烈建议使用 quantileExactWeightedInterpolated 而不是 quantileInterpolatedWeighted,因为 quantileExactWeightedInterpolated 比 quantileInterpolatedWeighted 更准确。
更多细节请参见下面的示例。
语法
quantileExactWeightedInterpolated(level)(expr, weight)别名: medianExactWeightedInterpolated
参数
level— 可选。分位数级别。取值为 0 到 1 之间的常量浮点数。建议将level设为[0.01, 0.99]范围内的值。默认值:0.5。当level=0.5时,函数计算中位数。Float*
实参
expr— 针对列值计算后得到数值数据类型、Date、DateTime或DateTime64的表达式。(U)Int*或Int128或UInt128或Int256或UInt256或Float*或Decimal*或Date或DateTime或DateTime64weight— 包含序列成员权重的列。权重表示值出现的次数。UInt*
返回值
指定级别的分位数。数值实参会生成 Float64,而 Decimal、Date、DateTime 和 DateTime64 实参会保留其输入格式。Float64 或 Decimal* 或 Date 或 DateTime 或 DateTime64
示例
计算精确加权插值分位数
CREATE TABLE t (
n Int32,
val UInt32
) ENGINE = Memory;
INSERT INTO t VALUES (0, 3), (1, 2), (2, 1), (5, 4);
SELECT quantileExactWeightedInterpolated(n, val) FROM t;┌─quantileExactWeightedInterpolated(n, val)─┐
│ 1.5 │
└───────────────────────────────────────────┘优先选择 quantileExactWeightedInterpolated,而非 quantileInterpolatedWeighted
SELECT
quantileExactWeightedInterpolated(0.99)(number, 1),
quantile(0.99)(number),
quantileInterpolatedWeighted(0.99)(number, 1)
FROM numbers(9)┌─quantileExactWeightedInterpolated(0.99)(number, 1)─┬─quantile(0.99)(number)─┬─quantileInterpolatedWeighted(0.99)(number, 1)─┐
│ 7.92 │ 7.92 │ 8 │
└────────────────────────────────────────────────────┴────────────────────────┴───────────────────────────────────────────────┘另请参阅