今天我遇到了一个关于分组和聚合的问题,我一直无法解决。也许这里有人看到我需要做什么。在此表上选择 * 将显示我正在使用的数据和列。这是结果示例
有问题的查询在这里:
SELECT campaign_id,
campaign_name,
start_time,
end_time,
sum(clicks) as clicks,
sum(impressions) as impressions,
sum(reach) as reach,
sum(spend) as cost,
avg(cpc) as cpc,
sum(PARSE_NUMERIC(a.value)) as mobile_app_install,
FROM dataexploration-193817.marketing_data.facebook_ads_data
JOIN UNNEST(actions) as a
WHERE a.action_type = 'mobile_app_install' AND start_time >= '{date_start}' AND start_time <= '{date_end}'
group by campaign_id,campaign_name,start_time,end_time;
查询将忽略所有数据,除非存在 mobile_app_install 操作类型。但是,如果我删除该约束,我会为每个广告系列获得多行,这也是我不想要的。我想要的是每个campaign_id的一行,它总结每个值(有或没有mobile_app_install action_type,但也给我带来mobile_app_install的总和。actions列是一个RECORD类型,其中包含“action_type”和“value”项目。
预先感谢您的帮助!
类型是
array of record
,并且您与它横向交叉连接,因此我认为会导致重复。
您可以使用横向子查询添加约束
SELECT campaign_id,
campaign_name,
start_time,
end_time,
sum(clicks) as clicks,
sum(impressions) as impressions,
sum(reach) as reach,
sum(spend) as cost,
avg(cpc) as cpc,
sum(PARSE_NUMERIC(a.value)) as mobile_app_install,
FROM
dataexploration-193817.marketing_data.facebook_ads_data t
WHERE
EXISTS(SELECT 1 FROM unnest(actions)
WHERE action_type = 'mobile_app_install' )
AND start_time >= '{date_start}'
AND start_time <= '{date_end}'
GROUP BY
campaign_id, campaign_name, start_time, end_time
;
unnest()
将数组转换为可以运行 SQL 的关系