Sql 在聚合联接中返回太多行的红移查询

Sql 在聚合联接中返回太多行的红移查询,sql,join,amazon-redshift,Sql,Join,Amazon Redshift,我肯定我错过了一些明显的东西。我正试图将两个具有不同测量数据的表排列起来进行分析,当我将两个表连接在一起时,我的计数会非常高 以下是我的表1中的正确计数 select line_item_id,sum(is_imp) as imps from table1 where line_item_id=5993252 group by 1; 以下是表2中的正确计数 select cs_line_item_id,sum(grossImpressions) as cs_imps from tabl

我肯定我错过了一些明显的东西。我正试图将两个具有不同测量数据的表排列起来进行分析,当我将两个表连接在一起时,我的计数会非常高

以下是我的表1中的正确计数

select line_item_id,sum(is_imp) as imps 
from table1 
where line_item_id=5993252 
group by 1;

以下是表2中的正确计数

select cs_line_item_id,sum(grossImpressions) as cs_imps
from table2 
where cs_line_item_id=5993252 
group by 1;

当我将表连接在一起时,我的计数变得不准确:

select a.line_item_id,sum(a.is_imp) as imps,sum(c.grossImpressions) as cs_imps
from table1 a join table2 c
ON a.line_item_id=c.cs_line_item_id
where a.line_item_id=5993252
group by 1;

我使用的是聚合、分组、过滤,所以我不确定哪里出了问题。以下是这些表的架构:

您正在为每个
行\u项目\u id
生成笛卡尔乘积。有两种相对简单的方法可以解决这个问题,一种是使用
完全联接
,另一种是使用
联合所有

select line_item_id, sum(imps) as imps, sum(grossImpressions) as cs_imps
from ((select a.line_time_id, sum(is_imp) as imps, 0 as grossImpressions
       from table1 a
       where a.line_item_id = 5993252
       group by a.line_item_id
      ) union all
      (select c.line_time_id, 0 as imps, sum(grossImpressions) as grossImpressions
       from table2 c
       where c.line_item_id = 5993252
       group by c.line_item_id
      )
     ) ac
group by line_item_id;
您可以从子查询中删除
where
子句,以获取所有
line\tiem\u id
s的总数。请注意,即使一个或另一个表中没有与给定
行\u item\u id
匹配的行,此操作也有效


为了提高性能,您确实希望在为每个
行\u item\u id
生成笛卡尔积之前执行过滤。有两种相对简单的方法可以解决这个问题,一种是使用
完全联接
,另一种是使用
联合所有

select line_item_id, sum(imps) as imps, sum(grossImpressions) as cs_imps
from ((select a.line_time_id, sum(is_imp) as imps, 0 as grossImpressions
       from table1 a
       where a.line_item_id = 5993252
       group by a.line_item_id
      ) union all
      (select c.line_time_id, 0 as imps, sum(grossImpressions) as grossImpressions
       from table2 c
       where c.line_item_id = 5993252
       group by c.line_item_id
      )
     ) ac
group by line_item_id;
您可以从子查询中删除
where
子句,以获取所有
line\tiem\u id
s的总数。请注意,即使一个或另一个表中没有与给定
行\u item\u id
匹配的行,此操作也有效


为了提高性能,您确实希望在
分组依据

看起来像是遇到笛卡尔联接之前执行筛选-lineitemid在两个表中都不能唯一line\u item\u id在两个表中都不唯一。两个表中的每一行都对应于一个测量计数,表1中的每一行为_imp=1或_imp=0。知道如何解决吗?要么在两个表的主键上联接,要么先上卷然后联接如果您遇到查询扇出,请参阅另一个解释此现象的答案:看起来您遇到了笛卡尔联接-lineitemid在两个表中都不能唯一Line\u item\u id在两个表中都不唯一。两个表中的每一行都对应于一个测量计数,表1中的每一行为_imp=1或_imp=0。知道如何解决吗?要么在两个表的主键上联接,要么先上卷,然后联接如果您遇到查询扇出,请参阅解释此现象的另一个答案: