Как агрегировать и группировать по в Google BigQuery

#sql #google-bigquery

#sql #google-bigquery

Вопрос:

В Google BigQuery я хотел бы свернуть показатели на основе определенных измерений (в данном случае по кампании и партнеру). Когда я использую приведенный ниже код, я получаю сообщение об ошибке:

Выражение ‘a.genre’ отсутствует в списке ГРУППИРОВАТЬ ПО.

Может кто-нибудь, пожалуйста, посоветовать, что мне нужно исправить в моем скрипте? Спасибо!
Пожалуйста, смотрите ниже пример таблицы (не обращайте внимания на то, что заголовки в таблице ниже не совсем соответствуют предоставленному скрипту):

введите описание изображения здесь

 SELECT
  SUM(a.amount) totalcost, 
  a.campaign_name, 
  c.friendly_campaign, 
  p.friendly_partner_name, 
  a.partner_name, 
  a.genre, 
  a.season, 
  a.package
FROM
  [TABLE 1] a
  LEFT OUTER JOIN
  [TABLE 2] p
ON
  a.partner_name = p.raw_partner_name
LEFT OUTER JOIN
  [TABLE 3] c 
ON
  a.campaign_name = c.campaign
GROUP BY ROLLUP(c.friendly_campaign, p.friendly_partner_name)
  

Ответ №1:

В SQL, в общем случае, — если вы агрегируете с использованием групп — вы должны решить, будет ли поле в вашем операторе select агрегироваться или является группой. Вы не можете просто оставить это там без какого-либо контекста. Итак, в вашем случае вы, вероятно, захотите либо удалить все остальные поля

 SELECT
  SUM(a.amount) totalcost, 
  c.friendly_campaign, 
  p.friendly_partner_name, 
FROM
  [TABLE 1] a
  LEFT OUTER JOIN
  [TABLE 2] p
ON
  a.partner_name = p.raw_partner_name
LEFT OUTER JOIN
  [TABLE 3] c 
ON
  a.campaign_name = c.campaign
GROUP BY ROLLUP(c.friendly_campaign, p.friendly_partner_name)
  

или добавьте их как группы, в которые вы агрегируете a.amount :

 SELECT
  SUM(a.amount) totalcost, 
  a.campaign_name, 
  c.friendly_campaign, 
  p.friendly_partner_name, 
  a.partner_name, 
  a.genre, 
  a.season, 
  a.package
FROM
  [TABLE 1] a
  LEFT OUTER JOIN
  [TABLE 2] p
ON
  a.partner_name = p.raw_partner_name
LEFT OUTER JOIN
  [TABLE 3] c 
ON
  a.campaign_name = c.campaign
GROUP BY ROLLUP(2,3,4,5,6,7,8)