Упрощая мою проблему, скажем, у меня есть две таблицы:
- "Пользователи", хранящие user_id и event_date от пользователей, которые получают доступ каждый день.
- "Закупки", хранящие 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](https://i.stack.imgur.com/UkSfW.png)
С другой стороны, это запрос, чтобы получить количество пользователей, которых я ожидаю получить в результате (8935 пользователей, с нулевыми значениями в product_id для пользователей, которые не покупают). Но на самом деле я получил 2724 разных пользователей (количество пользователей, совершивших покупки). ![enter image description here](https://i.stack.imgur.com/viyXL.png)
РЕДАКТИРОВАТЬ 2: Я нашел решение для моего желаемого результата, но все же я не понимаю, что не так с моим первый запрос ![enter image description here](https://i.stack.imgur.com/NKkqz.png)