跳到主要内容

口径不一致排查

场景描述

产品经理说日活 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: 如何从根本上避免口径不一致?

答案

  1. 指标平台:建立统一的指标定义平台,所有指标在平台维护
  2. One SQL:每个指标对应唯一 SQL,所有报表从指标平台取数
  3. 指标 Owner:每个指标指定责任人,修改需审批
  4. 版本管理:指标定义变更有记录、可追溯

Q2: 不同数据源的 DAU 差异达到 20%,正常吗?

答案

10%-20% 的差异在某些场景下是正常的,因为:

  • 埋点丢失率通常 2%-5%
  • 不同事件触发时机不同(启动 vs 页面浏览)
  • 去重字段不同(uid vs device_id,一个设备多个账号或一个账号多个设备)

但如果超过 20%,大概率是口径定义数据源本身有问题,需要深入排查。


相关链接