percentile()、percentiles()(聚合函数)

适用于:✅Azure 数据资源管理器Azure MonitorMicrosoft Sentinel

percentile() 函数为由 expr 定义的群体的指定最接近排名百分位数计算估计值。 准确性取决于百分位区域中的填充密度。

percentiles() 的工作方式与 percentile() 类似。 但是,percentiles() 可以同时计算多个百分位数值,这比单独计算每个百分位数值更有效。

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

注意

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

语法

percentile(expr, percentile)

percentiles(expr, percentiles)

详细了解语法约定

参数

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

返回

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

注意

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

示例

计算单个百分位数

下面的示例显示大于示例集 95% 和小于示例集 5% 的 DamageProperty 值。

StormEvents | summarize percentile(DamageProperty, 95) by State

输出

显示的结果表仅包括前 10 行。

状态 percentile_DamageProperty_95
大西洋南部 0
佛罗里达州 40000
佐治亚州 143333
密西西比州 80000
AMERICAN SAMOA 250000
KENTUCKY 35000
俄亥俄州 150000
KANSAS 51392
密歇根州 49167
ALABAMA 50000

计算多个百分位数

下面的示例显示同时使用 5、50(中值)和 95 计算的 DamageProperty 值。

StormEvents | summarize percentiles(DamageProperty, 5, 50, 95) by State

输出

显示的结果表仅包括前 10 行。

状态 percentile_DamageProperty_5 percentile_DamageProperty_50 percentile_DamageProperty_95
大西洋南部 0 0 0
佛罗里达州 0 0 40000
佐治亚州 0 0 143333
密西西比州 0 0 80000
AMERICAN SAMOA 0 0 250000
KENTUCKY 0 0 35000
俄亥俄州 0 2000 150000
KANSAS 0 0 51392
密歇根州 0 0 49167
ALABAMA 0 0 50000
... ...

以数组形式返回百分位数

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

语法

percentiles_array(expr, percentiles)

参数

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

返回

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

示例

逗号分隔的百分位数

可以在单个动态列中以数组形式获取多个百分位数,而不是像 percentiles() 一样在多个列中获取。

TransformedSensorsData
| summarize percentiles_array(Value, 5, 25, 50, 75, 95), avg(Value) by SensorName

输出

结果表仅显示前 10 行。

SensorName percentiles_Value avg_Value
sensor-82 ["0.048141473520867069","0.24407515500271132","0.48974511106780577","0.74160998970950343","0.94587903204190071"] 0.493950914
sensor-130 ["0.049200214398937764","0.25735850440187535","0.51206374010048239","0.74182335059053839","0.95210342463616771"] 0.505111463
sensor-56 ["0.04857779335488676","0.24709868149337144","0.49668762923789589","0.74458470404241883","0.94889104840865857"] 0.497955018
sensor-24 ["0.051507199150534679","0.24803904945640423","0.50397070213183581","0.75653888126010793","0.9518782718727431"] 0.501084379
sensor-47 ["0.045991246974755672","0.24644331118208851","0.48089197707088743","0.74475142784472248","0.9518322864959039"] 0.49386228
sensor-135 ["0.05132897529660399","0.24204987641954018","0.48470113942206461","0.74275730068433621","0.94784079559229406"] 0.494817619
sensor-74 ["0.048914714739047828","0.25160926036445724","0.49832498850160978","0.75257887767110776","0.94932261924236094"] 0.501627252
sensor-173 ["0.048333149363009836","0.26084250046756496","0.51288012531934613","0.74964772791583412","0.95156058795294"] 0.505401226
sensor-28 ["0.048511161184567046","0.2547387968731824","0.50101318228599656","0.75693845702682039","0.95243122486483989"] 0.502066244
sensor-34 ["0.049980293859462954","0.25094722564949412","0.50914023067384762","0.75571549713447961","0.95176564809278674"] 0.504309494
... ... ...

百分位数的动态数组

可以在整数或浮点数动态数组中指定 percentiles_array 的百分位数。 数组必须是常数,但不一定是文本。

TransformedSensorsData
| summarize percentiles_array(Value, dynamic([5, 25, 50, 75, 95])), avg(Value) by SensorName

输出

结果表仅显示前 10 行。

SensorName percentiles_Value avg_Value
sensor-82 ["0.048141473520867069","0.24407515500271132","0.48974511106780577","0.74160998970950343","0.94587903204190071"] 0.493950914
sensor-130 ["0.049200214398937764","0.25735850440187535","0.51206374010048239","0.74182335059053839","0.95210342463616771"] 0.505111463
sensor-56 ["0.04857779335488676","0.24709868149337144","0.49668762923789589","0.74458470404241883","0.94889104840865857"] 0.497955018
sensor-24 ["0.051507199150534679","0.24803904945640423","0.50397070213183581","0.75653888126010793","0.9518782718727431"] 0.501084379
sensor-47 ["0.045991246974755672","0.24644331118208851","0.48089197707088743","0.74475142784472248","0.9518322864959039"] 0.49386228
sensor-135 ["0.05132897529660399","0.24204987641954018","0.48470113942206461","0.74275730068433621","0.94784079559229406"] 0.494817619
sensor-74 ["0.048914714739047828","0.25160926036445724","0.49832498850160978","0.75257887767110776","0.94932261924236094"] 0.501627252
sensor-173 ["0.048333149363009836","0.26084250046756496","0.51288012531934613","0.74964772791583412","0.95156058795294"] 0.505401226
sensor-28 ["0.048511161184567046","0.2547387968731824","0.50101318228599656","0.75693845702682039","0.95243122486483989"] 0.502066244
sensor-34 ["0.049980293859462954","0.25094722564949412","0.50914023067384762","0.75571549713447961","0.95176564809278674"] 0.504309494
... ... ...

最接近排名百分位

排序值(按升序排序)的列表中第 P 个百分位 (0 <P<= 100) 是列表中的最小值。 数据的 P% 小于或等于第 P 个百分位值(请参考维基百科上关于百分位的文章)。

将第 0 个百分位定义为群体的最小成员。

注意

由于计算的近似性质,实际返回的值可能不是群体的成员。 最接近排名定义意味着 P=50 不符合中间值的插值定义。 针对特定应用程序计算此差异的重要性时,应考虑群体大小和估算误差

百分位中的估算错误

聚合百分位使用 T-Digest 提供近似值。

注意

  • 估算错误的界限因请求百分位的值而异。 在 [0..100] 范围的两端,准确性最高。 0 和 100 百分位是分布的确切最小值和最大值。 越接近此范围的中间值,准确性越低。 中间值准确性最差,不超过 1%。
  • 错误边界通过级别观察而不是通过值。 假设 percentile(X, 50) 返回了值 Xm。 此估算可保证至少 49%,至多 51% 的 X 值小于或等于 Xm。 对 Xm 与 X 的实际中间值之间的差异没有理论上的限制。
  • 估算有时可能会得出精确的值,但没有可靠的条件来定义何时会出现这种情况。