Короткий ответ
Приведите выгрузки к общей схеме и объединяйте строки через UNION ALL, если это параллельные платформенные записи. До сравнения нормализуйте идентификаторы, даты, валюту, часовые пояса и детализацию, а различия методик атрибуции обозначайте отдельно.
Как это работает подробнее
Сначала сопоставьте поля каждой платформы с общей моделью: источник, дата, аккаунт, campaign_id, валюта, расход, показы, клики и конверсии. Затем приведите типы, валюту и временные интервалы к общим правилам и используйте UNION ALL. JOIN подходит только для намеренного соединения сущностей по ключу; слепое соединение сырых строк может умножить суммы.
- Разные метрики. Название «конверсия» не гарантирует одинаковую модель атрибуции, окно или правило учёта.
- Аудит происхождения. Сохраняйте платформу-источник и исходный идентификатор кампании, чтобы объяснять расхождения.
Пример кода
unified_spend.sql
SELECT 'google_ads' AS platform, report_date, campaign_id, currency, spend
FROM google_ads_daily
UNION ALL
SELECT 'meta' AS platform, report_date, campaign_id, currency, spend
FROM meta_ads_daily
UNION ALL
SELECT 'tiktok' AS platform, report_date, campaign_id, currency, spend
FROM tiktok_ads_daily;Что использовать на практике
- Сначала нормализуйте. Создайте отдельный адаптер или слой staging для каждой платформы, а затем общий контракт полей.
- Сверьте агрегаты. Сопоставьте расход по источнику за завершённый период с нативным кабинетом до публикации сквозного отчёта.
Подводные камни
- JOIN вместо UNION. Соединение по дате без стабильного ключа может перемножить строки и завысить расход.
- Несопоставимые суммы. Сложение разных валют, часовых поясов или определений конверсии создаёт ложную точность.