BIGQUERY: заменить нулевой результат из одной таблицы идентификатором пользователя из другой таблицы - PullRequest
0 голосов
/ 10 июня 2019

надежных экспертов BQ.

Справочная информация: У меня есть пользователи, читающие статьи на веб-сайте (таблица пользователей A), и пользователи, просматривающие статьи из электронной почты (таблица пользователей B), и у меня есть таблицы просмотра BQ для каждого набора пользователей. В пользовательской таблице A отсутствуют некоторые user_id пользователей, которые просмотрели электронные письма. См. Таблицу пользователей A ниже.

*User Table A* - Website

id  | user_id    | article id  | viewed_at
------------------------------------------------------------------
1   | 1          | 1000        | 2019-01-25 01:04:00 UTC
2   | 2          | 1001        | 2019-01-25 01:03:00 UTC
3   | 3          | 1002        | 2019-01-25 01:03:00 UTC
4   | null       | 1001        | 2019-01-25 01:04:00 UTC
5   | null       | 1000        | 2019-01-24 20:49:00 UTC
6   | null       | 1003        | 2019-01-24 20:47:00 UTC


*User Table B* - Email

id  | user_id    | article id  | clicked_at
------------------------------------------------------------------
1   | 1          | 1000        | 2019-01-25 01:04:00 UTC
2   | 1          | 1000        | 2019-01-24 20:49:00 UTC
3   | 6          | 1003        | 2019-01-24 20:47:00 UTC

  • Я хочу создать одно представление / таблицу, которая заменяет нулевой результат user_id в пользовательской таблице A на user_id из пользовательской таблицы B ЕСЛИ views_at и clicked_at одинаковы И article_id из пользовательской таблицы A и пользовательской таблицы B также одинаковы.

  • Я также хочу сохранить нулевой результат user_id, если соответствующие просмотренные_каталоги / clicked_at и article_id не найдены в пользовательской таблице B.

*Desired Result Table*

id  | user_id    | article id  | viewed_at
------------------------------------------------------------------
1   | 1          | 1000        | 2019-01-25 01:04:00 UTC
2   | 2          | 1001        | 2019-01-25 01:03:00 UTC
3   | 3          | 1002        | 2019-01-25 01:03:00 UTC
4   | null       | 1001        | 2019-01-25 01:04:00 UTC
5   | 1          | 1000        | 2019-01-24 20:49:00 UTC
6   | 6          | 1003        | 2019-01-24 20:47:00 UTC

Надеюсь, это имеет смысл.

Пожалуйста, помогите. Это занимало мою голову в течение нескольких месяцев.

Ответы [ 2 ]

2 голосов
/ 10 июня 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT 
  a.id,
  IFNULL(a.user_id, b.user_id) user_id,
  a.article_id,
  viewed_at
FROM `project.dataset.website` a
LEFT JOIN `project.dataset.email` b
ON a.user_id IS NULL
AND a.article_id = b.article_id
AND viewed_at = clicked_at
0 голосов
/ 10 июня 2019

Я думаю, вы можете использовать left join:

select w.id,
       coalesce(w.user_id, e.user_id) as user_id,
       w.article_id, w.viewed_at
from website w left join
     email e
     on w.article_id = e.article_id and
        w.viewed_at = e.viewed_at and
        w.user_id is null;

Обратите внимание, этот логический тип предполагает, что у вас нет дубликатов в таблице email относительно article_id / viewed_at.

...