SQL 条件聚合
条件聚合在一个分组查询中回答了几个相关问题。无需扫描表一次以获取成功的请求,然后再次扫描表以获取失败的请求,而是将条件放入 CASE 表达式中,并将两个结果聚合在一起。此模式对于错误率、转换率、重试率、缓存命中率以及分母必须保持可见的任何结果非常有用。
计算结果并保护分母
SELECT
route_template,
COUNT(*) AS requests,
SUM(CASE WHEN status_code >= 500 THEN 1 ELSE 0 END) AS server_errors,
100.0 * SUM(CASE WHEN status_code >= 500 THEN 1 ELSE 0 END)
/ NULLIF(COUNT(*), 0) AS server_error_rate_pct
FROM api_request_events
WHERE timestamp_utc >= now() - INTERVAL '24 hours'
GROUP BY route_template
HAVING COUNT(*) >= 20
ORDER BY server_error_rate_pct DESC;
总数、条件计数和百分比讲述了故事的不同部分。总数确定了样本量。计数显示绝对影响。该费率使不同交通量的路线具有可比性。 NULLIF 保护比率免受零分母影响,而 100.0 将结果保留为百分比算术。
慎重选择人群
WHERE 子句定义分组前的总体。 CASE 表达式定义该群体中的哪些行与结果匹配。这种区别很重要:排除 WHERE 中的故障可以降低错误率,而在分母中包含健康检查可以使客户流量看起来比实际情况更健康。
当每一行都应位于一个状态桶中时,请使用互斥条件。当一行可以合法地满足多个标签时,请使用独立条件。始终检查桶的总和是否等于总数。
费率需要运营背景
两个事件的高百分比很少相当于 200 万个事件的相同百分比。将计数保留在结果中,使用经过审查的最小交易量规则,并比较完整的时间窗口。空状态值、重试、重复传递和延迟事件也需要明确的处理。
从测试的 API 错误率配方、事务回滚配方 或 转化率指南 开始。有关其他支持的语法,请参阅 DataFusion SQL 参考。