You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BigQuery中特定请求场景下AVG函数的正确使用方法

如何用BigQuery的AVG函数计算成功请求占比?

你的问题核心是想用AVG函数替代手动计算的方式,得到每个应用的成功请求(状态码200)占比。先看你原来的AVG写法为什么无效:

AVG(CASE WHEN operation_status = 200 THEN operation_status END) AS avg_status_200

这个写法是对所有状态码为200的行取状态码的平均值,比如APP_1有1个200和1个500,这个AVG计算的是200(非200的行CASE返回NULL,AVG会忽略NULL),自然不是你要的占比0.5。

正确的AVG写法

要计算占比,你需要让成功的行返回1,失败/其他状态的行返回0,然后对这个结果取平均值——本质就是成功行数除以总行数,和你手动计算的逻辑完全一致。

两种等价写法:

写法1:使用CASE表达式

SELECT
    app_name,
    COUNTIF(operation_status = 200) AS successful_ops,
    COUNTIF(operation_status = 500) AS failed_ops,
    AVG(CASE WHEN operation_status = 200 THEN 1 ELSE 0 END) AS success_rate_avg,
    (COUNTIF(operation_status=200)/COUNT(operation_status)) AS average_manual
FROM
    `requests`
GROUP BY
    app_name;

写法2:使用BigQuery的IF函数(更简洁)

SELECT
    app_name,
    COUNTIF(operation_status = 200) AS successful_ops,
    COUNTIF(operation_status = 500) AS failed_ops,
    AVG(IF(operation_status = 200, 1, 0)) AS success_rate_avg,
    (COUNTIF(operation_status=200)/COUNT(operation_status)) AS average_manual
FROM
    `requests`
GROUP BY
    app_name;

结果验证

运行上面的SQL后,success_rate_avg和average_manual会返回完全相同的值:

  • APP_1:0.5
  • APP_2:0.5
  • APP_3:1.0

这里我们用ELSE 0覆盖了所有非200的情况,每一行都有明确的1或0值,AVG计算的就是所有行的平均值,也就是成功行数占总行数的比例。

内容的提问来源于stack exchange,提问作者david7596

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 08:22:41