KPI:先定义测量和决策,再制作看板

内容摘要

KPI是为跟踪目标而选定的指标。数字本身不能诊断原因,也不能证明商业价值或安全性。

虚构的无人分析室,两张桌子上放有空白卡片、黄铜灯和酒红色文件夹
本文目录

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。

验证步骤

  1. 定义订单和明细的粒度。
  2. 连接含两条明细的订单。
  3. 保留键、行数及核对后的总额。

PostgreSQL — Table expressions and joins

SUM(DISTINCT total)能解决问题吗?

不能。两笔金额100的订单合计为200,而SUM(DISTINCT total)只返回100。应修正键的关联关系,而非按金额去重。

一手资料:PostgreSQL — Table expressions and joins. 相关方法:阅读实用指南.