使用 SQL 对结构化事件去重
重复数据删除首先是一个业务定义问题,然后才是一个 SQL 问题。两个看起来相似的事件可能表示重复传递、有意重试或两个有效的用户操作。从源生成的逻辑事件或交付标识符开始。不要从时间戳和消息字符串推断身份,除非生产者合约保证该组合是唯一的。
为每个稳定标识符选择一行
WITH ranked AS (
SELECT
event_id,
account_id,
event_name,
timestamp_utc,
received_at,
ROW_NUMBER() OVER (
PARTITION BY event_id
ORDER BY received_at ASC
) AS delivery_rank
FROM product_events
WHERE timestamp_utc >= now() - INTERVAL '7 days'
)
SELECT
account_id,
event_name,
timestamp_utc
FROM ranked
WHERE delivery_rank = 1;
此版本保留第一个收到的副本。状态同步表可能会保留最新记录。将选择写在查询旁边,因为更改顺序会更改结果的含义。
在删除重复项之前测量它们
计算原始行、不同标识符以及多次交付的标识符。当这些维度可以识别来源时,按生产商、SDK 版本、发布或交付路径细分结果。重复数据删除 CTE 可以使下游仪表板正确,同时隐藏日益严重的摄取问题。
不要单独对 account_id 和 event_name 进行重复数据删除。一个帐户可以合法地多次完成同一操作。同样,当问题是可靠性时,即使产品转化只计算最终的成功结果,重试也可能是有效的分析事件。
晚期事件需要有界的修正窗口。报告导出后到达的副本可能会更改最终计数,因此请记录报告截止日期以及结果是否是临时的。
使用 重复的事件 ID 配方 量化源重复,使用 窗口函数 了解排名操作。 事件架构指南 解释了如何添加使规则可审核的标识符。