SQL Объедините несколько разных строк в один ряд - PullRequest
0 голосов
/ 19 апреля 2020

Вот мой запрос:

SELECT
      basic_all_levels.date,
      basic_all_levels.account_id,
      basic_all_levels.ad_id,
      basic_all_levels.inline_link_clicks AS link_clicks,
      basic_all_levels.reach,
      basic_all_levels.spend AS cost,
      fb_basic_all_levels_cost_per_action_type.action_type,
      fb_basic_all_levels_cost_per_action_type.value,
      CASE WHEN (spend > 0) AND action_type = 'landing_page_view'
          THEN spend / value
          ELSE 0 END AS landing_page_views,
      CASE WHEN (spend > 0) AND action_type = 'offsite_conversions_fb_pixel_purchase'
          THEN  spend / value
          ELSE 0 END AS purchases,


  FROM `x.facebook_ad_insights.fb_basic_all_levels` AS basic_all_levels
  LEFT JOIN `x.facebook_ad_insights.fb_basic_all_levels_cost_per_action_type` AS fb_basic_all_levels_cost_per_action_type
      ON basic_all_levels.ad_id = fb_basic_all_levels_cost_per_action_type.ad_id and basic_all_levels.date = fb_basic_all_levels_cost_per_action_type.date

Вот мой результат

enter image description here

Мне нужна только одна строка, подобная следующей:

enter image description here

Мне не нужен столбец «значение», потому что я могу его пересчитать .

Я смотрел на многие вопросы, но я не понимаю, как агрегировать, потому что: - Группировка по не работает. В нем говорится, что: «просмотр целевой страницы» не группируется и не агрегируется - я проверил свое «левое соединение» и попытался проверить, существует ли что-то более подходящее - я увидел функцию поворота, но хочу выбрать только указанные значения c ( целевые страницы просмотров и покупки и не все перечисленные в столбцах типов действий.

Ответы [ 2 ]

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

Я бы go с версией ниже (BigQuery Standard SQL)

#standardSQL
SELECT
  basic_all_levels.date,
  basic_all_levels.account_id,
  basic_all_levels.ad_id,
  basic_all_levels.inline_link_clicks AS link_clicks,
  basic_all_levels.reach,
  basic_all_levels.spend AS cost,
  IF(landing_page_views > 0, spend / landing_page_views, 0) AS landing_page_views,
  IF(purchases > 0, spend / purchases, 0) AS purchases
FROM `x.facebook_ad_insights.fb_basic_all_levels` AS basic_all_levels
LEFT JOIN (
  SELECT
    ad_id,
    `date`,
    SUM(IF(action_type = 'landing_page_view', value, 0)) AS landing_page_views,
    SUM(IF(action_type = 'offsite_conversions_fb_pixel_purchase', value)) AS purchases
  FROM `x.facebook_ad_insights.fb_basic_all_levels_cost_per_action_type`
  GROUP BY ad_id, `date`
) AS fb_basic_all_levels_cost_per_action_type
USING(ad_id, `date`)   

Должно быть намного более оптимальным по сравнению с версией сначала JOIN'ing, а затем GROUP'ing

0 голосов
/ 19 апреля 2020

Я думаю, вы ищете агрегацию. Как можно лучше понять:

SELECT bal.date, bal.account_id, bal.ad_id,
       spend as cost,
       SUM(CASE WHEN spend > 0 AND action_type = 'landing_page_view'
                THEN spend / value ELES 0
           END) AS landing_page_views,
       SUM(CASE WHEN spend > 0 AND action_type = 'offsite_conversions_fb_pixel_purchase'
                THEN  spend / value ELSE 0
           END) AS purchases
FROM `x.facebook_ad_insights.fb_basic_all_levels` bal LEFT JOIN
     `x.facebook_ad_insights.fb_basic_all_levels_cost_per_action_type` balcat       
     ON bal.ad_id = balcat.ad_id AND
        bal.date = balcat.date
GROUP BY bal.date, bal.account_id, bal.ad_id, spend;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...