KPI是为跟踪目标而选定的指标。数字本身不能诊断原因,也不能证明商业价值或安全性。
写清测量约定
记录目标、公式、单位、分子、分母、人群和时期,明确负责人及拟支持的决策。每条线索成本不等于每位新客户成本;比率应注明费用范围和结果定义。
先核查变化再行动
检查覆盖、重复、可用延迟和定义变更。各比率的平均值不一定是总体比率,应使用相应计数。阈值触发调查,而不自动说明原因。工具不能保证收集质量。
| 项目 | 需记录的检查 |
|---|---|
| 定义 | 记录公式、单位和范围 |
| 质量 | 检查覆盖、重复和可用性 |
| 决策 | 明确负责人、行动和限制 |
来源与核查
将每个 KPI 与合同和决策关联起来。
一个有效的指标应明确变更应支持的行动。在设定目标之前,记录公式、总体、来源和导致数值不完整的条件。仪表板可能正确遵循其定义,但如果单位或范围不同,则无法回答业务问题。
- 写入分子、分母和排除项。
- 检查从事件到图表的已知案例。
- 显示最新更新和仍不完整的周期。
一手资料:Google SRE — Data Processing Pipelines. 相关方法:阅读实用指南.
为 KPI 赋予上下文。
百分比 KPI 需要单位、计数和周期。相同的数值可能代表截然不同的体积和不确定性。
- 发布比率时,应同时发布分子和分母。
- 在解读数据之前,记录部分数据收集和缺失的数据。
一手资料:NIST/SEMATECH — Confidence intervals for proportions. 相关方法:阅读实用指南.
数据连接完整性
连接可能增加行数并扭曲总计。
- 订单表的一行代表一笔订单,明细表的一行代表该订单中的一项商品。合并前检查重复键与空键。
- 按订单键汇总明细,再将结果关联到订单,避免每项商品都重复订单金额。与原订单表的合计核对。
- LEFT JOIN保留没有明细的订单,但针对右表的WHERE条件可能再次排除这些订单。未匹配不等于金额为零。
可复现的验收案例
虚构示例:数据不代表客户或实际观察结果。
查看案例输入
{
"orders": [
{
"id": 1,
"total": 100
},
{
"id": 2,
"total": 200
}
],
"line_order_ids": [
1,
1,
2
],
"sum_before": 300,
"sum_after_raw_join": 400
}预期判断
400重复计算了一笔订单。先按订单汇总明细,恢复总额300。 另测两笔各100的虚构订单:总额应为200。SUM(DISTINCT total)会返回100,删掉一个合法值。应核查标识符与连接基数,而非对金额去重。
可复现的SQL查询
虚构示例:两笔订单金额为100和200,三条明细关联到1、1、2。查询只使用VALUES,请在测试环境执行。
WITH orders(id, total) AS (VALUES (1, 100), (2, 200)),
lines(order_id) AS (VALUES (1), (1), (2))
SELECT COUNT(*) AS rows, SUM(o.total) AS total
FROM orders o JOIN lines l ON l.order_id = o.id;WITH orders(id, total) AS (VALUES (1, 100), (2, 200)),
lines(order_id) AS (VALUES (1), (1), (2)),
per_order AS (
SELECT order_id, COUNT(*) AS line_count
FROM lines GROUP BY order_id
)
SELECT COUNT(*) AS orders, SUM(o.total) AS total
FROM orders o LEFT JOIN per_order l ON l.order_id = o.id;直接关联得到三行、总额400;先汇总可恢复两笔订单、总额300。
WITH orders(id, total) AS (VALUES (1, 100), (2, 100))
SELECT SUM(total) AS correct_total,
SUM(DISTINCT total) AS distinct_total
FROM orders;金额为100和100时,正确合计为200,而SUM(DISTINCT total)返回100。
验证步骤
- 定义订单和明细的粒度。
- 连接含两条明细的订单。
- 保留键、行数及核对后的总额。
SUM(DISTINCT total)能解决问题吗?
不能。两笔金额100的订单合计为200,而SUM(DISTINCT total)只返回100。应修正键的关联关系,而非按金额去重。
一手资料:PostgreSQL — Table expressions and joins. 相关方法:阅读实用指南.
