口径不一致排查
场景描述
产品经理说日活 100 万,运营说 80 万,BI 报表显示 90 万。三方数据打架,需要你排查原因。
常见口径不一致原因
| 不一致类型 | 示例 | 排查方法 |
|---|---|---|
| 定义不同 | "活跃"标准不同 | 对齐指标定义文档 |
| 数据源不同 | 埋点 vs 服务端日志 | 比较 SQL 数据源 |
| 统计逻辑不同 | COUNT(DISTINCT uid) vs COUNT(DISTINCT device_id) | Review SQL |
| 时间范围不同 | UTC vs UTC+8 | 检查时区转换 |
| 过滤条件不同 | 含/不含爬虫流量 | 检查 WHERE 条件 |
排查步骤
1. 收集各方 SQL
-- 产品经理的口径(来自埋点平台,启动事件)
SELECT COUNT(DISTINCT user_id) AS dau
FROM event_log
WHERE event_name = 'app_launch'
AND dt = '2024-01-15';
-- 运营的口径(来自行为日志,有效浏览)
SELECT COUNT(DISTINCT user_id) AS dau
FROM page_view_log
WHERE duration > 3 -- 停留超过 3 秒才算有效
AND dt = '2024-01-15';
-- BI 报表的口径(来自用户活跃宽表)
SELECT dau FROM dm_user_active
WHERE dt = '2024-01-15';
2. 逐项对比
-- 找出差异用户
-- 产品有、运营无的用户
SELECT a.user_id
FROM (
SELECT DISTINCT user_id FROM event_log
WHERE event_name = 'app_launch' AND dt = '2024-01-15'
) a
LEFT JOIN (
SELECT DISTINCT user_id FROM page_view_log
WHERE duration > 3 AND dt = '2024-01-15'
) b ON a.user_id = b.user_id
WHERE b.user_id IS NULL;
-- → 这批用户启动了 App 但没有停留 3 秒以上的浏览行为
3. 输出对齐方案
| 维度 | 统一标准 |
|---|---|
| 指标名 | DAU(日活跃用户数) |
| 定义 | 当日有至少 1 次页面浏览行为的独立用户 |
| 去重字段 | user_id(注册用户)/ device_id(游客) |
| 数据源 | dwd_page_view(页面浏览明细表) |
| 时间粒度 | 自然日(UTC+8,00:00–23:59) |
| 过滤条件 | 排除爬虫(is_bot = 0) |
常见面试问题
Q1: 如何从根本上避免口径不一致?
答案:
- 指标平台:建立统一的指标定义平台,所有指标在平台维护
- One SQL:每个指标对应唯一 SQL,所有报表从指标平台取数
- 指标 Owner:每个指标指定责任人,修改需审批
- 版本管理:指标定义变更有记录、可追溯
Q2: 不同数据源的 DAU 差异达到 20%,正常吗?
答案:
10%-20% 的差异在某些场景下是正常的,因为:
- 埋点丢失率通常 2%-5%
- 不同事件触发时机不同(启动 vs 页面浏览)
- 去重字段不同(uid vs device_id,一个设备多个账号或一个账号多个设备)
但如果超过 20%,大概率是口径定义或数据源本身有问题,需要深入排查。