LEFT JOIN отбрасывает левые строки в результатах? - PullRequest
0 голосов
/ 31 января 2020

Упрощая мою проблему, скажем, у меня есть две таблицы:

  1. "Пользователи", хранящие user_id и event_date от пользователей, которые получают доступ каждый день.
  2. "Закупки", хранящие user_id, event_date и product_id от пользователей, которые совершают покупки каждый день.

Мне нужно получить от всех пользователей их соответствующие покупки продуктов или нулевое значение для product_id, если пользователь не совершил покупку. Для этого я сделал этот запрос:

with all_users as (
  select user_id from `my_project.my_dataset.Users`
  where event_date = "2019-12-01"
)

select user_id,product_id
from all_users
left join `my_project.my_dataset.Purchases`
  using(user_id)
where event_date = "2019-12-01"

Но этот запрос возвращает только user_id, который совершил покупки, другими словами, в LEFT есть строки from_item (all_users), которые опускаются в результате.

Это работает, как указано? Я читал, что LEFT JOIN всегда сохраняет все строки слева from_item.

EDIT 1: Добавление некоторых снимков экрана: это полный запрос, описанный ранее, но с реальным имена (таблица «Пользователи» - «user_metrics_daily», а таблица «Покупки» - «virtual_currency_daily»). Как вы видите, я добавил count(distinct user_pseudo_id)OVER(), чтобы подсчитать, сколько разных пользователей в результате.

enter image description here

С другой стороны, это запрос, чтобы получить количество пользователей, которых я ожидаю получить в результате (8935 пользователей, с нулевыми значениями в product_id для пользователей, которые не покупают). Но на самом деле я получил 2724 разных пользователей (количество пользователей, совершивших покупки). enter image description here

РЕДАКТИРОВАТЬ 2: Я нашел решение для моего желаемого результата, но все же я не понимаю, что не так с моим первый запрос enter image description here

1 Ответ

0 голосов
/ 31 января 2020

Ваш запрос (как есть) должен вернуть ошибку, потому что user_id неоднозначно. BigQuery не знает, хотите ли вы столбец из all_users или my_project.my_dataset.Purchases.

. Отбрасывая это, вы должны явно указать, из какой таблицы должны исходить столбцы. В вашем случае user_id от all_users и product_id от my_project.my_dataset.Purchases.

with all_users as (
  select user_id from `my_project.my_dataset.Users`
  where event_date = "2019-12-01"
)

select
  a.user_id,
  p.product_id
from all_users as a
left join `my_project.my_dataset.Purchases` as p on a.user_id = p.user_id
where event_date = "2019-12-01"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...