Pagevies,联系人和公司的INNER JOIN-重复的条目

问题描述

简而言之:3个表内部联接重复记录

我在3个表中的BigQuery中有数据:

浏览量,其中包含列:

  • 时间戳
  • user_id
  • 标题
  • 路径

联系人,其中包含列:

  • website_user_id
  • 电子邮件
  • company_id

公司具有列:

  • id
  • 名称

我要显示所有记录的综合浏览量,如果知道用户和/或公司,则在综合浏览量旁边显示此数据。

首先,我加入联系人和综合浏览量数据(SQL是由Metabase商业智能工具生成的):

SELECT 
  `analytics.pageviews`.`timestamp` AS `timestamp`,`analytics.pageviews`.`title` AS `title`,`analytics.pageviews`.`path` AS `path`,`Contacts`.`email` AS `email`
FROM `analytics.pageviews` 
INNER JOIN `analytics.contacts` `Contacts` ON `analytics.pageviews`.`user_id` = `Contacts`.`website_user_id`
ORDER BY `timestamp` DESC

它按预期工作,我可以看到归因于已知联系人的综合浏览量。

接下来,我想显示与已知公司以及这家公司的联系人的综合浏览量:

SELECT 
  `analytics.pageviews`.`timestamp` AS `timestamp`,`Contacts`.`email` AS `email`,`Companies`.`name` AS `name`
FROM `analytics.pageviews` 
INNER JOIN `analytics.contacts` `Contacts` ON `analytics.pageviews`.`user_id` = `Contacts`.`website_user_id` 
INNER JOIN `analytics.companies` `Companies` ON `Contacts`.`company_id` = `Companies`.`id`
ORDER BY `timestamp` DESC

通过该查询,我希望仅看到已知关联的联系人和公司的综合浏览量(只是公司名称的另一列)。问题是,每个网页浏览量都有重复的行(有时是5,有时是20个相同的行)。

我要避免选择DISTINCT时间戳,因为它可能导致从具有相同时间戳的不同用户中排除有效的网页浏览量。

该如何处理?

解决方法

您的描述听起来像是companies中的重复字母。这很容易测试:

select c.id,count(*)
from `analytics.companies` c
group by c.id
having count(*) >= 2;

您可以使用窗口功能获取详细信息:

select c.*
from (select c.*,count(*) over (partition by c.id) as cnt
      from `analytics.companies` c
     ) c
where cnt >= 2
order by cnt desc,id;

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...