Значения увеличиваются при добавлении оператора JOIN - PullRequest
0 голосов
/ 10 апреля 2020

У меня были некоторые проблемы с этой проблемой в течение нескольких дней, и я не могу понять ее.

(Запуск это Bigquery)

Для маркетингового клиента я пытаюсь получать показы и клики по рекламодателю.

p_impressions содержит все данные о показах, включая идентификаторы Campaign_ID, Advertiser_ID p_click содержит все данные о кликах, включая идентификаторы Campaign_ID, Advertiser_ID match_table_campaigns содержит данные кампании: Campaign_ID, Название кампании

(по сути, моя простая цель - получить количество показов и кликов и сопоставить его с таблицей Campaign, чтобы я мог видеть название кампании, а не только ее идентификатор.

Когда я запускаю запрос используя UNION all для таблиц Impression и Click, используя только IDS, все числа соответствуют моей платформе, и все выглядит отлично.

Однако, когда я вставляю JOIN (я перепробовал все), чтобы включить название кампании, все показатели показов и клик, кажется, увеличивается, и я кажется, больше не могу получить правильные числа.

with combinedDeliveryData AS (
SELECT
  FORMAT_DATETIME("%F",DATETIME(TIMESTAMP_MILLIS( CAST(SUBSTR(CAST( Event_Time AS String),0,LENGTH(CAST( Event_Time AS String)) - 3) AS INT64 )),"America/Toronto")) AS Date,
  Impression_ID,
  DBM_Advertiser_ID,
  Campaign_ID,
  Ad_ID,
  Rendering_ID,
  Event_Type,
  Advertiser_ID,
FROM
  CampaignManager.p_impression
UNION ALL
SELECT
  FORMAT_DATETIME("%F",DATETIME(TIMESTAMP_MILLIS( CAST(SUBSTR(CAST( Event_Time AS String),0,LENGTH(CAST( Event_Time AS String)) - 3) AS INT64 )),"America/Toronto")) AS Date,
  Impression_ID,
  DBM_Advertiser_ID,
  Campaign_ID,
  Ad_ID,
  Rendering_ID,
  Event_Type,
  Advertiser_ID,
FROM
  CampaignManager.p_click)

SELECT cpg.Campaign_ID, cpg.Campaign,data.Date,COUNT(case data.Event_Type when 'VIEW' then 1 else null end) AS Impressions
FROM match_table_campaigns AS cpg
LEFT JOIN combinedDeliveryData AS data ON cpg.Campaign_ID = data.Campaign_ID
WHERE cpg.Advertiser_ID = "4739279"
GROUP BY 3,1,2

Любая помощь будет принята с благодарностью. Я не уверен, что мне не хватает.

Как примечание, вот что работает без JOIN

SELECT
  Impression_ID,
  Event_Time,
  DBM_Advertiser_ID,
  Campaign_ID,
  Ad_ID,
  Rendering_ID,
  Event_Type,
  Advertiser_ID
FROM
  CampaignManager.p_impression
UNION ALL
SELECT
  Impression_ID,
  Event_Time,
  DBM_Advertiser_ID,
  Campaign_ID,
  Ad_ID,
  Rendering_ID,
  Event_Type,
  Advertiser_ID
FROM
  CampaignManager.p_click)
SELECT FORMAT_DATETIME("%F",DATETIME(TIMESTAMP_MILLIS( CAST(SUBSTR(CAST( clicks.Event_Time AS String),0,LENGTH(CAST( clicks.Event_Time AS String)) - 3) AS INT64 )),"America/Toronto")) AS exposureDate,clicks.Campaign_ID,COUNT(case Event_Type when 'VIEW' then 1 else null end) AS Impressions,COUNT(case Event_Type when 'CLICK' then 1 else null end) AS Clicks
FROM 
combinedDeliveryData AS clicks
WHERE clicks.Campaign_ID = "4739279"
GROUP BY 1,2

НОВЫЙ ВЫПУСК: Я добавил следующий код, и все выглядело замечательно

  this_is_deduplicated AS (
    SELECT x.*
    FROM (
      SELECT Campaign_ID, ARRAY_AGG(a LIMIT 1)[OFFSET(0)] x
      FROM combinedDeliveryData a
      GROUP BY 1
    ) 
  )

LEFT JOIN this_is_deduplicated AS data ON cpg.Campaign_ID = data.Campaign_ID

Получение всех моих ценностей, и они точные. Сейчас я сталкиваюсь с другой проблемой, когда мне нужно присоединиться к финальной таблице, но решение, приведенное выше, не работает для него.

Значения в новой таблице: Дата Campaign_ID Activity_ID

Мне нужно Теперь присоединитесь к этой последней таблице, чтобы для каждой даты я получал СЧЕТА Activity_ID как беседы.

Моя финальная таблица должна быть:

Рекламодатель, Кампания, Показы, Клики, Конверсии (как выше )

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Я почти уверен, что причина в том, что в таблице combinedDeliveryData есть несколько идентичных campaign_id.

Перед объединением убедитесь, что в кампании есть только один идентификатор. С чем-то вроде:

WITH [...], 
  this_is_deduplicated AS (
    SELECT x.*
    FROM (
      SELECT Campaign_ID, ARRAY_AGG(a LIMIT 1)[OFFSET(0)] x
      FROM combinedDeliveryData a
      GROUP BY 1
    ) 
  )

И JOIN против этого, как в:

LEFT JOIN this_is_deduplicated AS data ON cpg.Campaign_ID = data.Campaign_ID

вместо

LEFT JOIN combinedDeliveryData AS data ON cpg.Campaign_ID = data.Campaign_ID

или короче

LEFT JOIN this_is_deduplicated AS data USING(Campaign_ID)
0 голосов
/ 10 апреля 2020

Возможно, вам понадобится присоединиться к campaign и campaign_id. При условии, что вы образец запроса ниже

select
    t1.date,
    t1.campaign_id,
    t1.campaign,
    sum(case when t1.event = 'view' then 1 else 0 end) as impressions,
    sum(case when t2.event = 'click' then 1 else 0 end) as clicks
from table1 as t1
left join table2 as t2
on t1.campaign = t2.campaign
and on t1.campaign_id = t2.campaign_id

where advertiser_id = '12345'
group by
    t1.campaign_id,
    t1.campaign,
    t1.date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...