Query Service中的重复数据删除
Adobe Experience Platform Query Service支持重复数据删除。 当需要从计算中删除整个行或忽略特定字段集(因为行中只有部分数据是重复信息)时,可以执行重复数据删除。
去重通常涉及在窗口内对一个ID(或一对ID)在有序时间内使用ROW_NUMBER()
函数,这返回一个新字段,表示检测到重复项的次数。 时间通常使用Experience Data Model (XDM) timestamp
字段表示。
当ROW_NUMBER()
的值为1
时,它引用原始实例。 通常,这是您希望使用的实例。 此操作通常在子选择内完成,其中重复数据删除在更高级别的SELECT
中完成,如执行聚合计数。
重复数据删除用例可以是全局的,也可以限制为identityMap
中的单个用户或最终用户ID。
本文档概述了如何针对三个常见用例执行重复数据删除:体验事件、购买和量度。
每个示例都包括范围、窗口键、重复数据删除方法的大纲以及完整SQL查询。
体验事件 experience-events
如果出现重复的体验事件,您可能希望忽略整行。
范围: 全局
窗口键: id
重复数据删除示例
SELECT *,
ROW_NUMBER()
OVER (PARTITION BY id
ORDER BY timestamp ASC
) AS id_dup_num
FROM experience_events
完整示例
SELECT COUNT(*) AS num_events FROM (
SELECT *,
ROW_NUMBER()
OVER (PARTITION BY id
ORDER BY timestamp ASC
) AS id_dup_num
FROM experience_events
) WHERE id_dup_num = 1
购买次数 purchases
如果存在重复购买,则您可能希望保留Experience Event行中的大部分内容,但忽略与购买关联的字段(如commerce.orders
量度)。 购买包含用于购买ID的特殊字段,即commerce.order.purchaseID
。
建议在访客范围中使用purchaseID
,因为它是用于XDM中购买ID的标准语义字段。 建议使用访客范围来删除重复的购买数据,因为查询速度比使用全局范围更快,并且在多个访客ID之间不可能存在重复的购买ID。
范围: 访客
窗口键: identityMap[$NAMESPACE].id & commerce.order.purchaseID
重复数据删除示例
SELECT *,
IF(LENGTH(commerce.`order`.purchaseID) > 0,
ROW_NUMBER()
OVER (PARTITION BY identityMap['ECID'].id, commerce.`order`.purchaseID
ORDER BY timestamp ASC
),
1) AS purchaseID_dup_num
FROM experience_events
完整示例
以下示例使用condition子句在购买ID不存在的情况下使用事件ID。
SELECT SUM(commerce.purchases.value) AS num_purchases FROM (
SELECT *,
ROW_NUMBER()
OVER (PARTITION BY id
ORDER BY timestamp ASC
) AS id_dup_num,
IF(LENGTH(commerce.`order`.purchaseID) > 0,
ROW_NUMBER()
OVER (PARTITION BY identityMap['ECID'].id, commerce.order.purchaseID
ORDER BY timestamp ASC
),
1) AS purchaseID_dup_num
FROM experience_events
) WHERE id_dup_num = 1 AND purchaseID_dup_num = 1
量度 metrics
如果您有一个量度正在使用可选的唯一ID,并且显示该ID的重复项,则您可能需要忽略该量度值并保留体验事件的其余部分。
在XDM中,几乎所有量度都使用Measure
数据类型,该数据类型包含可用于重复数据删除的可选id
字段。
范围: 访客
窗口键: identityMap[$NAMESPACE].ID和度量值对象的ID
重复数据删除示例
SELECT *,
IF(LENGTH(application.launches.id) > 0,
ROW_NUMBER()
OVER (PARTITION BY identityMap['ECID'].id, application.launches.id
ORDER BY timestamp ASC
),
1) AS launchesID_dup_num
FROM experience_events
完整示例
SELECT SUM(application.launches.value) AS num_launches FROM (
SELECT *,
ROW_NUMBER()
OVER (PARTITION BY id
ORDER BY timestamp ASC
) AS id_dup_num,
IF(LENGTH(application.launches.id) > 0,
ROW_NUMBER()
OVER (PARTITION BY identityMap['ECID'].id, application.launches.id
ORDER BY timestamp ASC
),
1) AS launchesID_dup_num
FROM experience_events
) WHERE id_dup_num = 1 AND launchesID_dup_num = 1