stats

stats 命令用于对搜索结果计算聚合。

比较 stats、eventstats 和 streamstats

关于 statseventstatsstreamstats 命令的全面比较,包括它们在转换行为、输出格式、聚合范围和用例方面的差异,请参阅 比较 stats、eventstats 和 streamstats

语法

stats 命令的语法如下:

stats [bucket_nullable=bool] <aggregation>... [by-clause]

参数

stats 命令支持以下参数。

参数 必需/可选 描述
<aggregation> 必需 聚合函数。
<by-clause> 可选 按指定字段或表达式对结果进行分组。语法:by [span-expression,] [field,]... 如果未指定 by-clause,则 stats 命令仅返回一行,即对整个搜索结果的聚合。
bucket_nullable 可选 控制是否在分组聚合中包含 null 桶。当为 false 时,忽略 group-by 字段为 null 的记录,从而提高性能。默认值为 plugins.ppl.syntax.legacy.preferred 的值。
<span-expression> 可选 按间隔将字段拆分为桶(最多一个)。语法:span(field_expr, interval_expr)。默认情况下,间隔使用字段的默认单位。对于日期/时间字段,聚合结果忽略空值。示例:span(age, 10) 创建 10 岁的年龄桶,span(timestamp, 1h) 创建小时桶。有效时间单位为毫秒 (ms)、秒 (s)、分钟 (m)、小时 (h)、天 (d)、周 (w)、月 (M)、季度 (q)、年 (y)。

聚合函数

stats 命令支持以下聚合函数:

  • COUNT/C – 值的计数

  • SUM – 数值的总和

  • AVG – 数值的平均值

  • MAX – 最大值

  • MIN – 最小值

  • VAR_SAMP – 样本方差

  • VAR_POP – 总体方差

  • STDDEV_SAMP – 样本标准差

  • STDDEV_POP – 总体标准差

  • DISTINCT_COUNT_APPROX – 近似去重计数

  • TAKE – 原始值列表

  • PERCENTILE/PERCENTILE_APPROX – 百分位数计算

  • PERC<percent>/P<percent> – 百分位数快捷函数

  • MEDIAN – 第 50 百分位数(中位数)

  • EARLIEST – 按时间戳最早的值

  • LATEST – 按时间戳最新的值

  • FIRST – 第一个非空值

  • LAST – 最后一个非空值

  • LIST – 将所有值收集到数组中

  • VALUES – 将唯一值收集到排序数组中

有关每个函数的详细文档,请参阅 函数

示例 1:计算事件计数

以下查询计算 accounts 索引中的事件计数:

source=accounts
| stats count()

该查询返回以下结果:

../../../../_images/stats-1.png

示例 2:计算字段的平均值

以下计算所有账户的平均年龄:

source=accounts
| stats avg(age)

该查询返回以下结果:

../../../../_images/stats-2.png

示例 3:按组计算字段的平均值

以下查询按性别分组,计算所有账户的平均年龄:

source=accounts
| stats avg(age) by gender

该查询返回以下结果:

../../../../_images/stats-3.png

示例 4:按组计算字段的平均值、总和和计数

以下查询按性别分组,计算所有账户的平均年龄、年龄总和以及事件计数:

source=accounts
| stats avg(age), sum(age), count() by gender

该查询返回以下结果:

../../../../_images/stats-4.png

示例 5:计算字段的最大值

以下查询计算所有账户的最大年龄:

source=accounts
| stats max(age)

该查询返回以下结果:

../../../../_images/stats-5.png

示例 6:按组计算字段的最大值和最小值

以下查询按性别分组,计算所有账户的最大和最小年龄:

source=accounts
| stats max(age), min(age) by gender

该查询返回以下结果:

../../../../_images/stats-6.png

示例 7:计算字段的去重计数

要检索字段的不同值的计数,可以使用 DISTINCT_COUNT(或 DC)函数代替 COUNT。以下查询计算所有账户中 gender 字段的计数和去重计数:

source=accounts
| stats count(gender), distinct_count(gender)

该查询返回以下结果:

../../../../_images/stats-7.png

示例 8:按跨度计算计数

以下查询检索按 10 年间隔分组的 age 值计数:

source=accounts
| stats count(age) by span(age, 10) as age_span

该查询返回以下结果:

../../../../_images/stats-8.png

示例 9:按性别和跨度计算计数

以下查询检索按 5 年间隔分组并按 gender 细分的 age 计数:

source=accounts
| stats count() as cnt by span(age, 5) as age_span, gender

该查询返回以下结果:

../../../../_images/stats-9-1.png

无论 span 表达式在 by 子句中的位置如何,它始终被视为第一个分组键:

source=accounts
| stats count() as cnt by gender, span(age, 5) as age_span

该查询返回以下结果:

../../../../_images/stats-9-2.png

示例 10:按性别和年龄跨度计数并检索电子邮件列表

以下查询计算按 5 年间隔以及按 gender 分组的 age 值计数,并返回每个组最多 5 个电子邮件的列表:

source=accounts
| stats count() as cnt, take(email, 5) by span(age, 5) as age_span, gender

该查询返回以下结果:

../../../../_images/stats-10.png

示例 11:计算字段的百分位数

以下查询计算所有账户年龄的第 90 个百分位数:

source=accounts
| stats percentile(age, 90)

该查询返回以下结果:

../../../../_images/stats-11.png

示例 12:按组计算字段的百分位数

以下查询按性别分组,计算所有账户年龄的第 90 个百分位数:

source=accounts
| stats percentile(age, 90) by gender

该查询返回以下结果:

../../../../_images/stats-12.png

示例 13:按性别和跨度计算百分位数

以下查询计算按 10 年间隔以及按 gender 分组的年龄的第 90 个百分位数:

source=accounts
| stats percentile(age, 90) as p90 by span(age, 10) as age_span, gender

该查询返回以下结果:

../../../../_images/stats-13.png