таблица возвращается после группы и объединений имеет нереально большие числа - PullRequest
0 голосов
/ 15 декабря 2018

Я пытаюсь объединить маркетинговые данные, которые мы имеем в Google, с данными, которые мы имеем в Facebook, по местоположению.Первый оператор SELECT получает столбцы из таблицы, созданной с помощью вложенного оператора SELECT в строке 5. Затем мне нужно соединить это с другой таблицей, чтобы получить имя DMA (строка 11).Наконец, я объединяю это с данными Facebook.Когда я запускаю запрос, результаты по кликам, расходам и показам все учитываются, когда я суммирую все DMA.Вместо этого они должны составлять от 10 до 100 миллионов, в зависимости от показателя.

Я действительно новичок в SQL, поэтому я уверен, что есть лучшие способы подумать о том, как решить эту проблему.Я уверен, что мой синтаксис не соответствует стандартам лучшей практики.Я приветствую все отзывы.

SELECT sum(sub.clicks) AS clicks, sum(sub.spend) AS spend, 
       sum(sub.impressions) AS impressions, sub.date, 
       location_with_adwordsID.DMA_NAME, sub.ad_network_type_2
FROM
       (SELECT sum(clicks) AS clicks, sum(cost) AS spend, 
        sum(impressions) AS 
        impressions, cast(date AS Date) AS date, city_criteria_id , 
        ad_network_type_2
FROM   adwords.location
GROUP BY date, city_criteria_id, ad_network_type_2) AS sub
LEFT JOIN location_conversion.location_with_adwordsID ON 
         CAST(sub.city_criteria_id AS STRING) = 
         CAST(location_with_adwordsID.criteria_id AS STRING)
GROUP BY date, DMA_NAME, ad_network_type_2
UNION ALL
(SELECT sum(clicks) AS clicks, sum(spend) AS spend, sum(impressions) AS 
        impressions, CAST(date AS Date) AS date,  lower(dma) AS fbdma, 
        'Facebook' as Source FROM 
         facebook_ad_insights_dma.ad_insights_locations
GROUP BY Date, fbdma)

Вот структура таблицы 'location_with_adwordsID'.https://drive.google.com/file/d/1oKd3O_fVOjwO1EnZ5LFjHIiB3EB32be5/view?usp=sharing

Вот структура таблицы adwords.location.https://drive.google.com/file/d/1XlHC7Ug2yW9XNkNR6kolmmJPrfUa-S6n/view?usp=sharing

Причина ЛЕВОГО СОЕДИНЕНИЯ заключается в следующем: Google Ads предоставляет мне данные о местоположении с, казалось бы, проприетарным 'city_id'.Чтобы объединить эти данные с данными Facebook, мне нужно добавить столбец DMA в таблицу AdWords, а затем объединить FB и Google.Вот где появляется мой 'location_with_adwordsID', представляющий собой таблицу, созданную Google, в которой есть city_id по DMA и почтовому индексу.Таким образом, мой желаемый результат после этого соединения - это таблица с тем же числом строк, что и в «adwords.location», но с дополнительным столбцом «DMA».

Спасибо.

1 Ответ

0 голосов
/ 16 декабря 2018

Трудно дать точный ответ, не видя структуру таблиц и пример данных.

Однако, исходя из вашего кода SQL, похоже, что у вас есть ненужный вложенный запрос в вашем первом SELECT:вам не нужен подзапрос sub, вы можете напрямую соединять таблицы adwords.location и location_conversion.location и использовать агрегированные функции (SUM) в полях SELECT ed.Это упростит запрос и устранит потенциальное дублирование.

Попробуйте:

SELECT 
    sum(clicks) AS clicks,
    sum(spend) AS spend,
    sum(impressions) AS impressions,
    cast(date AS Date) AS date,
    location_with_adwordsID.dma_date, 
    sub.ad_network_type_2
FROM
    adwords.location
    LEFT JOIN location_conversion.location_with_adwordsID
        ON CAST(loc.city_criteria_id AS STRING) = CAST(ad.criteria_id AS STRING)
GROUP BY 
    date,
    dma_name,
    ad_network_type_2
UNION ALL
SELECT
    sum(clicks) AS clicks,
    sum(spend) AS spend,
    sum(impressions) AS impressions,
    CAST(date AS Date) AS date,
    lower(dma) AS fbdma, 
    'Facebook' as Source
FROM facebook_ad_insights_dma.ad_insights_locations
GROUP BY 
    date,
    fbdma

Если вы все еще получаете нереалистичные данные, то вам нужно проверить соотношение между adwords.location (которое я назвал какloc) и location_conversion.location_with_adwordsID (с псевдонимом ad): если в ad имеется несколько записей для данного criteria_id, то ваш запрос будет считать одну и ту же запись loc несколько раз, что вызывает проблему,В этом случае вы должны уточнить JOIN, добавив дополнительные критерии.

...