JOIN взрывает мои итоги, несмотря на то, что они правы независимо - PullRequest
0 голосов
/ 12 марта 2019

Я начну с двух независимых запросов, которые дают мне правильные результаты для каждого:

SELECT
  DATE_TRUNC(ga.traffic_date, WEEK(MONDAY)) week_start,
  SUM(traffic) traffic
FROM
  `ga.daily_traffic` 
  WHERE traffic_date >= '2019-03-04'

Возвращает:

+--------------+---------+
| traffic_week | traffic |
+--------------+---------+
| 2019-03-04   |   66572 |
+--------------+---------+

Второй запрос:

  SELECT
  week_start,
  SUM(traffic) traffic
FROM
 `marketing.channel_spend`
 WHERE week_start = '2019-03-04'

Возвращает:

+------------+----------+
| week_start |  spend   |
+------------+----------+
| 2019-03-04 | 80143.07 |
+------------+----------+

Я должен отметить для этого второго запроса: поле week_start уже хранится с еженедельным приращением, что, возможно, является причиной этого (?) Когда я соединяю два вместе, как так:

SELECT
  week_start,
  SUM(spend) spend,
  SUM(traffic) traffic
FROM
  `ga.daily_traffic` ga
LEFT JOIN `marketing.channel_spend` chan
ON DATE_TRUNC(ga.traffic_date, WEEK(MONDAY)) = chan.week_start
WHERE week_start = '2019-03-04'
GROUP BY 1
ORDER BY 1 DESC

Производит следующее:

+------------+---------+-----------+
| week_start | traffic |   spend   |
+------------+---------+-----------+
| 2019-03-04 |  153115 | 561001.49 |
+------------+---------+-----------+

Что вызывает общее количество трафика и расходы взорвать?

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Гордон прав.Скорее всего, между таблицами marketing.channel_spend и ga.daily_traffic существует отношение один ко многим или много ко многим.В этом случае вхождение 2 или более одинаковых дат в этих 2 таблицах приведет к объединению в каждом вхождении в первом с каждым вхождением во второй таблице.Это взорвет ваши результаты.Вы должны агрегировать предварительное объединение так, чтобы вы выполняли однозначное объединение на дату, что означает, что ни одно из них не будет дублироваться.

SELECT
    chan.week_start,
    chan.spend spend,
    ga.traffic traffic
FROM (
    SELECT
        SUM(traffic) traffic,
        DATE_TRUNC(ga.traffic_date, WEEK(MONDAY)) ga_date
    FROM
        `ga.daily_traffic` 
    GROUP BY
        ga_date
) ga
LEFT JOIN (
    SELECT
        SUM(spend) spend,
        week_start
    FROM
        `marketing.channel_spend`
    GROUP BY
        week_start
) chan ON ga.ga_date = chan.week_start
WHERE chan.week_start = '2019-03-04'
1 голос
/ 12 марта 2019

вы можете использовать cte

with cte as
(
SELECT
  DATE_TRUNC(ga.traffic_date, WEEK(MONDAY)) week_start,
  SUM(traffic) traffic
FROM
  `ga.daily_traffic` 
  WHERE traffic_date >= '2019-03-04'
),cte2 as
(
SELECT
  week_start,
  SUM(traffic) traffic
FROM
 `marketing.channel_spend`
 WHERE week_start = '2019-03-04'
) select cte.week_start,cte.traffic,cte2.traffic as chanel_traffic  from  cte left join cte2 on cte.week_start=cte2.week_start
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...