【问题标题】:Redshift Query returning too many rows in aggregate joinRedshift Query 在聚合连接中返回太多行
【发布时间】:2018-11-28 14:13:25
【问题描述】:

我确定我一定遗漏了一些明显的东西。我正在尝试将两个具有不同测量数据的表排成一行以进行分析,当我将这两个表连接在一起时,我的计数返回非常高。

以下是我的 table1

中的正确计数
select line_item_id,sum(is_imp) as imps 
from table1 
where line_item_id=5993252 
group by 1;

以下是 table2

中的正确计数
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;

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

【问题讨论】:

  • 看起来您遇到了笛卡尔连接 - lineitemid 在两个表中不能是唯一的
  • line_item_id 在两个表中都不是唯一的。两个表中的每一行都对应一个测量计数,在表 1 的情况下是 is_imp = 1 或 is_imp = 0。知道如何解决吗?
  • 要么加入两个表的主键,要么先上卷再加入
  • 您遇到查询扇出,请参阅解释此现象的其他答案:stackoverflow.com/questions/46279081/…

标签: sql join amazon-redshift


【解决方案1】:
select a.*, b.imps table2_imps from
(select line_item_id,sum(is_imp) as imps 
from table1  
group by 1)a
join 
(select line_item_id,sum(is_imp) as imps 
from table1  
group by 1)b
on a.select line_item_id=b.select line_item_id

【讨论】:

    【解决方案2】:

    您正在为每个line_item_id 生成一个笛卡尔积。有两种相对简单的方法可以解决这个问题,一种是full join,另一种是union all

    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_ids 的总数。请注意,即使一个或另一个表没有与给定 line_item_id 匹配的行,这仍然有效。

    为了性能,您确实希望在group by 之前进行过滤。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2013-12-02
      • 2016-05-12
      • 1970-01-01
      相关资源
      最近更新 更多