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和Measure物件識別碼
重複資料刪除範例
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