Sql BIGQUERY:替换a';空';使用另一个表的用户id从一个表生成的结果

Sql BIGQUERY:替换a';空';使用另一个表的用户id从一个表生成的结果,sql,google-bigquery,timestamp,bigquery-standard-sql,Sql,Google Bigquery,Timestamp,Bigquery Standard Sql,值得信赖的BQ专家 背景: 我让用户在网站上阅读文章(用户表a),用户通过电子邮件点击文章(用户表B),并为每个用户设置BQ视图表。用户表A缺少通过电子邮件单击的用户的某些用户id。见下面的用户表A *User Table A* - Website id | user_id | article id | viewed_at ------------------------------------------------------------------ 1 | 1

值得信赖的BQ专家

背景: 我让用户在网站上阅读文章(用户表a),用户通过电子邮件点击文章(用户表B),并为每个用户设置BQ视图表。用户表A缺少通过电子邮件单击的用户的某些用户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

  • 我想创建一个视图/表,用用户表B中的用户id替换用户表a中的空用户id结果如果查看和单击的位置相同,并且用户表a和用户表B中的文章id也相同

  • 如果在用户表B中找不到相应的viewed_at/clicked_at和article_id,我还希望保留user_id null结果

我希望这是有道理的


请帮忙。这已经让我头疼了好几个月了。

我想你可以使用
左连接:

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;

请注意,这种逻辑排序假设您在
电子邮件
表中没有重复的
文章id
/
查看位置

我认为您可以使用
左连接

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;

请注意,这种逻辑排序假定您在
电子邮件
表中没有重复的
文章id
/
查看的

下面是针对BigQuery标准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

下面是BigQuery标准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

@米哈伊尔你过去帮了大忙,你对这件事有什么想法吗?谢谢,@gordonlinoff你帮了大忙。不过我有一个问题。我对一篇文章进行了查询,这篇文章(在网站上)的总阅读量为6251。如果我只是用相应的用户id(如果存在)替换“null”值,那么我假设这个总读取计数不应该改变。当我运行这两个查询时(它给出的结果与Mikail的查询相同),我得到的总文章阅读计数结果为21109。你知道为什么会发生这种事吗?@mikhail你过去帮了大忙,你对这件事有什么想法吗?谢谢,@gordonlinoff你帮了大忙。不过我有一个问题。我对一篇文章进行了查询,这篇文章(在网站上)的总阅读量为6251。如果我只是用相应的用户id(如果存在)替换“null”值,那么我假设这个总读取计数不应该改变。当我运行这两个查询时(它给出的结果与Mikail的查询相同),我得到的总文章阅读计数结果为21109。你知道为什么会发生这种事吗?谢谢,@mikhail你帮了我大忙。不过我有一个问题。我对一篇文章进行了查询,这篇文章(在网站上)的总阅读量为6251。如果我只是用相应的用户id(如果存在)替换“null”值,那么我假设这个总读取计数不应该改变。当我运行这两个查询时(它给出的结果与Gordon的查询相同),我得到的总文章阅读计数结果是21109。您知道为什么会发生这种情况吗?我希望如此,因为没有任何逻辑可以阻止表A中具有NULL的同一行与表B中具有相同文章和数据的多行匹配,从而增加结果中的行数。您需要提出解决此问题的业务逻辑,并提出post问题。你现在的问题——答案是Hanks@mikhail。我可以查询不同的用户id,这确实有助于解决我的另一个问题,因此非常感谢您的帮助。谢谢,@mikhail您的帮助。不过我有一个问题。我对一篇文章进行了查询,这篇文章(在网站上)的总阅读量为6251。如果我只是用相应的用户id(如果存在)替换“null”值,那么我假设这个总读取计数不应该改变。当我运行这两个查询时(它给出的结果与Gordon的查询相同),我得到的总文章阅读计数结果是21109。您知道为什么会发生这种情况吗?我希望如此,因为没有任何逻辑可以阻止表A中具有NULL的同一行与表B中具有相同文章和数据的多行匹配,从而增加结果中的行数。您需要提出解决此问题的业务逻辑,并提出post问题。你现在的问题——答案是Hanks@mikhail。我可以查询不同的用户id,这确实有助于解决我的另一个问题,因此非常感谢您的帮助。@Livewire。你接受了6小时后发布的基本相同的答案。嘿@gordonlinoff抱歉,我对答案选择的工作方式不太熟悉。你能简单地解释一下礼仪吗?对不起,我冒犯了你。。。没有一个是有线电视。你接受了6小时后发布的基本相同的答案。嘿@gordonlinoff抱歉,我对答案选择的工作方式不太熟悉。你能简单地解释一下礼仪吗?对不起,我冒犯了你。。。没有人打算这么做。