pagevies、联系人和公司的 INNER JOIN - 重复的条目

INNER JOIN of pagevies, contacts and companies - duplicated entries

简而言之:3 table 内连接重复记录

我在 3 table 秒内将数据存入 BigQuery:

综合浏览量,列数:

联系人 列:

公司 列:

我想显示所有记录的综合浏览量,如果用户 and/or 公司已知,则在综合浏览量旁边显示此数据。

首先,我加入联系人和浏览量数据(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`,
  `analytics.pageviews`.`title` AS `title`, 
  `analytics.pageviews`.`path` AS `path`, 
  `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 行相同的行)。

我想避免选择不同的时间戳,因为它可能导致排除来自不同用户但具有相同时间戳的有效网页浏览。

如何解决这个问题?

您的描述听起来好像在 companies 中有重复。这很容易测试:

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

您可以使用 window 函数获取详细信息:

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;