percentilew()、percentilesw()(聚合函数)

percentilew() 函数计算由 expr 定义的群体的指定最接近排名百分位数的加权估计值。 percentilesw() 的工作方式与 percentilew() 类似。 但是,percentilesw() 可以同时计算多个加权百分位数值,这比单独计算每个加权百分位数值更有效。

加权百分位数通过为输入数据集中的每个值指定一个权重来计算数据集中的百分位数。 在此方法中,每个值被认为重复了等于其权重的次数,该权重随后用于计算百分位数。 通过赋予某些值更大的权重,加权百分位数提供了一种以“加权”方式计算百分位数的方法。

若要计算未加权百分位数,请参阅 percentiles()

注意

此函数与 summarize 运算符结合使用。

语法

percentilew(expr,weightExpr,percentile)

percentilesw(expr,weightExpr,percentiles)

详细了解语法约定

参数

客户 类型​​ 必需 说明
expr string 用于聚合计算的表达式。
weightExpr long 要赋予每个值的权重。
percentile int 或 long 一个常数,用于指定百分位。
percentiles int 或 long 一个百分位数,或多个由逗号分隔的百分位数。

返回

返回一个表,其中包含与组中的指定百分位数对应的 expr 的估计值,每个估计值位于单独的列中。

注意

若要在单个列中返回所有百分位数,请参阅以数组的形式返回百分位数

示例

计算加权百分位数

假设你重复测量完成某个操作所需的时间(持续时间)。 你将记录每个持续时间值(舍入到 100 毫秒)和舍入值的出现次数 (BucketSize),而非记录每个测量值。

使用 summarize percentilesw(Duration, BucketSize, ...) 按“加权”方式计算给定的百分位。 将持续时间的每个值视为在输入中重复 BucketSize 次,实际上不需要实现这些记录。

下面的示例显示了加权百分位数。 使用以下一组延迟值(以毫秒为单位):{ 1, 1, 2, 2, 2, 5, 7, 7, 12, 12, 15, 15, 15, 18, 21, 22, 26, 35 }

若要减少带宽和存储,请对以下 Bucket 进行预聚合:{ 10, 20, 30, 40, 50, 100 }。 计算每个 Bucket 中的事件数以生成下表:

let latencyTable = datatable (ReqCount:long, LatencyBucket:long) 
[ 
    8, 10, 
    6, 20, 
    3, 30, 
    1, 40 
];
latencyTable

该表:

  • 在 10 毫秒 Bucket 内显示了 8 个事件(对应于子集 { 1, 1, 2, 2, 2, 5, 7, 7 }
  • 在 20 毫秒 Bucket 内显示了 6 个事件(对应于子集 { 12, 12, 15, 15, 15, 18 }
  • 在 30 毫秒 Bucket 内显示了 3 个事件(对应于子集 { 21, 22, 26 }
  • 在 40 毫秒 Bucket 内显示了 1 个事件(对应于子集 { 35 }

此时,原始数据不再可用。 仅提供每个 Bucket 中的事件数。 若要根据此数据计算百分位,请使用 percentilesw() 函数。 对于 50、75 和 99.9 百分位,请使用以下查询:

let latencyTable = datatable (ReqCount:long, LatencyBucket:long) 
[ 
    8, 10, 
    6, 20, 
    3, 30, 
    1, 40 
];
latencyTable
| summarize percentilesw(LatencyBucket, ReqCount, 50, 75, 99.9)

输出

percentile_LatencyBucket_50 percentile_LatencyBucket_75 percentile_LatencyBucket_99_9
20 20 40

以数组的形式返回百分位数

使用 percentilesw_array() 函数在动态数组类型的单个列中返回所有百分位数,而不是将每个值在单独的列中返回。

语法

percentilesw_array(expr,weightExpr,percentiles)

参数

客户 类型​​ 必需 说明
expr string 用于聚合计算的表达式。
percentiles int、long 或 dynamic 一个百分位数,或多个由逗号分隔的百分位数,或百分位数的动态数组。 每个百分位数都可以是整型值或长整型值。
weightExpr long 要赋予每个值的权重。

返回

将与组中的指定百分位数对应的 expr 的估计值以动态数组类型的单列形式返回。

示例

逗号分隔的百分位数

let latencyTable = datatable (ReqCount:long, LatencyBucket:long) 
[ 
    8, 10, 
    6, 20, 
    3, 30, 
    1, 40 
];
latencyTable
| summarize percentilesw_array(LatencyBucket, ReqCount, 50, 75, 99.9)

输出

percentile_LatencyBucket
[20, 20, 40]

百分位数的动态数组

let latencyTable = datatable (ReqCount:long, LatencyBucket:long) 
[ 
    8, 10, 
    6, 20, 
    3, 30, 
    1, 40 
];
latencyTable
| summarize percentilesw_array(LatencyBucket, ReqCount, dynamic([50, 75, 99.9]))

输出

percentile_LatencyBucket
[20, 20, 40]