【问题标题】:Values increasing when JOIN Statement is added添加 JOIN 语句时值增加
【发布时间】:2020-04-10 17:58:16
【问题描述】:

这几天我在这个问题上遇到了一些困难,我无法弄清楚。

(运行这是 Bigquery)

对于营销客户,我试图获取每个广告客户的展示次数和点击次数。

p_impressions 包含所有展示数据,包括 IDs Campaign_ID、Advertiser_ID p_click 拥有所有的点击数据,包括 IDs Campaign_ID, Advertiser_ID match_table_campaigns 有广告系列数据:Campaign_ID、广告系列名称

(基本上我的简单目标是获取展示次数和点击次数并将其与 Campaign 表相匹配,这样我就可以看到广告系列的名称而不仅仅是 ID。

当我使用 UNION all 对 Impression 和 Click 表运行查询时,仅使用 IDS,所有数字都与我的平台匹配,一切看起来都很好。

但是,当我插入一个 JOIN(我已经尝试了所有这些)以包含广告系列的名称时,展示次数和点击次数的所有指标似乎都在增加,而且我似乎无法再获得正确的数字了。

with combinedDeliveryData AS (
SELECT
  FORMAT_DATETIME("%F",DATETIME(TIMESTAMP_MILLIS( CAST(SUBSTR(CAST( Event_Time AS String),0,LENGTH(CAST( Event_Time AS String)) - 3) AS INT64 )),"America/Toronto")) AS Date,
  Impression_ID,
  DBM_Advertiser_ID,
  Campaign_ID,
  Ad_ID,
  Rendering_ID,
  Event_Type,
  Advertiser_ID,
FROM
  CampaignManager.p_impression
UNION ALL
SELECT
  FORMAT_DATETIME("%F",DATETIME(TIMESTAMP_MILLIS( CAST(SUBSTR(CAST( Event_Time AS String),0,LENGTH(CAST( Event_Time AS String)) - 3) AS INT64 )),"America/Toronto")) AS Date,
  Impression_ID,
  DBM_Advertiser_ID,
  Campaign_ID,
  Ad_ID,
  Rendering_ID,
  Event_Type,
  Advertiser_ID,
FROM
  CampaignManager.p_click)
  
SELECT cpg.Campaign_ID, cpg.Campaign,data.Date,COUNT(case data.Event_Type when 'VIEW' then 1 else null end) AS Impressions
FROM match_table_campaigns AS cpg
LEFT JOIN combinedDeliveryData AS data ON cpg.Campaign_ID = data.Campaign_ID
WHERE cpg.Advertiser_ID = "4739279"
GROUP BY 3,1,2

任何帮助将不胜感激。我不确定我错过了什么。

请注意,这是没有 JOIN 的情况

SELECT
  Impression_ID,
  Event_Time,
  DBM_Advertiser_ID,
  Campaign_ID,
  Ad_ID,
  Rendering_ID,
  Event_Type,
  Advertiser_ID
FROM
  CampaignManager.p_impression
UNION ALL
SELECT
  Impression_ID,
  Event_Time,
  DBM_Advertiser_ID,
  Campaign_ID,
  Ad_ID,
  Rendering_ID,
  Event_Type,
  Advertiser_ID
FROM
  CampaignManager.p_click)
SELECT FORMAT_DATETIME("%F",DATETIME(TIMESTAMP_MILLIS( CAST(SUBSTR(CAST( clicks.Event_Time AS String),0,LENGTH(CAST( clicks.Event_Time AS String)) - 3) AS INT64 )),"America/Toronto")) AS exposureDate,clicks.Campaign_ID,COUNT(case Event_Type when 'VIEW' then 1 else null end) AS Impressions,COUNT(case Event_Type when 'CLICK' then 1 else null end) AS Clicks
FROM 
combinedDeliveryData AS clicks
WHERE clicks.Campaign_ID = "4739279"
GROUP BY 1,2

新问题: 我添加了以下代码,看起来很棒

  this_is_deduplicated AS (
    SELECT x.*
    FROM (
      SELECT Campaign_ID, ARRAY_AGG(a LIMIT 1)[OFFSET(0)] x
      FROM combinedDeliveryData a
      GROUP BY 1
    ) 
  )

LEFT JOIN this_is_deduplicated AS data ON cpg.Campaign_ID = data.Campaign_ID

得到我所有的价值观,它们是不准确的。我现在遇到了另一个问题,我必须加入决赛桌,但上面的解决方案不起作用。

新表中的值: 日期 广告系列_ID Activity_ID

我现在需要加入最后一个表,这样对于每个日期,我都会获得 Activity_ID 的 COUNT 作为 Conversiions。

我的决赛桌应该是:

广告商、广告系列、展示次数、点击次数、转化次数(如上)

【问题讨论】:

  • 如果加入时数字增加,则表明match_table_campaigns中存在多个具有相同Campaign_ID的记录。

标签: sql google-bigquery


【解决方案1】:

我几乎可以确定原因是combinedDeliveryData 表中有多个相同的campaign_id。

在加入之前确保每个广告系列只有一个 ID。像这样的东西:

WITH [...], 
  this_is_deduplicated AS (
    SELECT x.*
    FROM (
      SELECT Campaign_ID, ARRAY_AGG(a LIMIT 1)[OFFSET(0)] x
      FROM combinedDeliveryData a
      GROUP BY 1
    ) 
  )

而JOIN 反对,如:

LEFT JOIN this_is_deduplicated AS data ON cpg.Campaign_ID = data.Campaign_ID

而不是

LEFT JOIN combinedDeliveryData AS data ON cpg.Campaign_ID = data.Campaign_ID

或更短的

LEFT JOIN this_is_deduplicated AS data USING(Campaign_ID)

【讨论】:

  • 我也怀疑这一点,但我不知道如何解决它。我从未使用过:ARRAY_AGG(a LIMIT 1)[OFFSET(0)],我是否必须将其包含在对 combineDeliveryData 的查询中,还是将其包含在我加入的第二个查询中?我确实尝试在第二个查询的末尾添加它,但再次得到不正确的结果......如果你能根据我当前的查询提供帮助,那将是惊人的
  • 我根据上面的评论做了一些修改。基本上用这个替换现有的连接表
  • 好的,我刚刚添加了这个并做了一个选择 * 因为我想了解这个输出是什么,我现在得到它 - 我现在得到的问题是我的选择语句 data.date 没有不再存在,因为它现在被分配给去重表
  • 好的,我不得不重新做一些其他的代码并让它与这个方法一起工作......非常感谢。
  • 我想我知道你的意思...试试我现在添加的额外x.*
【解决方案2】:

您可能需要加入campaign 和campaign_id。提供以下示例查询

select
    t1.date,
    t1.campaign_id,
    t1.campaign,
    sum(case when t1.event = 'view' then 1 else 0 end) as impressions,
    sum(case when t2.event = 'click' then 1 else 0 end) as clicks
from table1 as t1
left join table2 as t2
on t1.campaign = t2.campaign
and on t1.campaign_id = t2.campaign_id

where advertiser_id = '12345'
group by
    t1.campaign_id,
    t1.campaign,
    t1.date

【讨论】:

  • 两个表中都不存在广告系列,只有 Campaign_ID 存在
猜你喜欢
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-23
相关资源
最近更新 更多