BigQuery 分组、聚合查询问题/问题

问题描述 投票:0回答:1

今天我遇到了一个关于分组和聚合的问题,我一直无法解决。也许这里有人看到我需要做什么。在此表上选择 * 将显示我正在使用的数据和列。这是结果示例

有问题的查询在这里:

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”项目。

预先感谢您的帮助!

sql group-by google-bigquery aggregate-functions
1个回答
0
投票

类型是

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 的关系

© www.soinside.com 2019 - 2024. All rights reserved.