SQL 内部联接在联接后返回错误值
SQL inner join returning wrong values after join
我有两个 table,分别是 ads
和 videos
。像 date,ad_id,ad_name,campaign_name
这样的维度在两个 table 中都很常见。但是,广告 table 有 spend
和 impressions
,而 videos
table 有 videoviews
。当我按每个 table 分组时,我聚合的指标值似乎没问题。但是一旦我加入他们, return 输出就不正确
例如,如果第 1 天的总支出对于特定 ad_id 是 100
,当我加入他们时,我将其视为 400
.
SELECT
a.date adsdate, a.campaign_name campaign_name,
a.ad_group_name ad_group_name,
a.ad_name ad_name,
a.ad_id ad_id,
SUM(a.cost) fb_cost,
SUM(a.impressions) fb_impressions,
SUM(b.action_video_view) fb_videoview
FROM
fb_ads a inner join
`fb_videos b ON
CONCAT(a.date,'_',a.ad_id)=
CONCAT(b.date,'_',b.ad_id)
GROUP BY
adsdate,
campaign_name,
ad_group_name,
ad_name,
ad_id
HAVING
ad_id = ‘1234567’
order by
adsdate asc
检查这个:
SELECT adsdate,
a.campaign_name,
a.ad_group_name,
a.ad_name,
'1234567' ad_id,
a.fb_cost,
a.fb_impressions,
b.fb_videoview
FROM ( SELECT `date` adsdate,
campaign_name,
ad_group_name,
ad_name,
SUM(cost) fb_cost,
SUM(impressions) fb_impressions
FROM fb_ads
WHERE ad_id = '1234567'
GROUP BY 1,2,3,4 ) a
JOIN ( SELECT `date` adsdate,
SUM(action_video_view) fb_videoview
FROM fb_videos
WHERE ad_id = '1234567'
GROUP BY 1 ) b USING (adsdate)
How would I do this with by joining using concat – sten
您使用唯一的 ad_id
值 (ad_id = ‘1234567’) - 所以通过它加入没有意义,通过 adsdate
加入就足够了。
但是如果你想通过 2 列连接,那么你不需要串联。使用以下任一加入条件:
.. ON t1.ad_id = t2.ad_id AND t1.adsdate = t2.adsdate ..
.. ON (t1.ad_id, t1.adsdate) = (t2.ad_id, t2.adsdate) ..
.. USING (ad_id, adsdate) ..
所有这些形式都与您使用 CONCAT
的表达式完全等价,但更加快速和清晰。
我有两个 table,分别是 ads
和 videos
。像 date,ad_id,ad_name,campaign_name
这样的维度在两个 table 中都很常见。但是,广告 table 有 spend
和 impressions
,而 videos
table 有 videoviews
。当我按每个 table 分组时,我聚合的指标值似乎没问题。但是一旦我加入他们, return 输出就不正确
例如,如果第 1 天的总支出对于特定 ad_id 是 100
,当我加入他们时,我将其视为 400
.
SELECT
a.date adsdate, a.campaign_name campaign_name,
a.ad_group_name ad_group_name,
a.ad_name ad_name,
a.ad_id ad_id,
SUM(a.cost) fb_cost,
SUM(a.impressions) fb_impressions,
SUM(b.action_video_view) fb_videoview
FROM
fb_ads a inner join
`fb_videos b ON
CONCAT(a.date,'_',a.ad_id)=
CONCAT(b.date,'_',b.ad_id)
GROUP BY
adsdate,
campaign_name,
ad_group_name,
ad_name,
ad_id
HAVING
ad_id = ‘1234567’
order by
adsdate asc
检查这个:
SELECT adsdate,
a.campaign_name,
a.ad_group_name,
a.ad_name,
'1234567' ad_id,
a.fb_cost,
a.fb_impressions,
b.fb_videoview
FROM ( SELECT `date` adsdate,
campaign_name,
ad_group_name,
ad_name,
SUM(cost) fb_cost,
SUM(impressions) fb_impressions
FROM fb_ads
WHERE ad_id = '1234567'
GROUP BY 1,2,3,4 ) a
JOIN ( SELECT `date` adsdate,
SUM(action_video_view) fb_videoview
FROM fb_videos
WHERE ad_id = '1234567'
GROUP BY 1 ) b USING (adsdate)
How would I do this with by joining using concat – sten
您使用唯一的 ad_id
值 (ad_id = ‘1234567’) - 所以通过它加入没有意义,通过 adsdate
加入就足够了。
但是如果你想通过 2 列连接,那么你不需要串联。使用以下任一加入条件:
.. ON t1.ad_id = t2.ad_id AND t1.adsdate = t2.adsdate ..
.. ON (t1.ad_id, t1.adsdate) = (t2.ad_id, t2.adsdate) ..
.. USING (ad_id, adsdate) ..
所有这些形式都与您使用 CONCAT
的表达式完全等价,但更加快速和清晰。