根据Redshift中的条件过滤数据

时间:2017-11-09 04:47:04

标签: sql amazon-redshift

我在解决上一个问题时遇到了另外一个问题: 所以,我有这些数据: Data

对于每条路线 - >我想只得到rb中存在ob的那些行。因此,这个输出: Output

我知道这也需要通过临时表来完成。之前我正按照@smb:

的建议这样做

从table_name中选择*作为 内部联接 (从table_name中选择load,rb 按负载分组,rb)为b 在a.load = b.load上 和 a.ob = b.rb

但是这个解决方案会给我: Wrong Output

这是不正确的,因为它没有考虑路线。

如果你们能提供帮助,那就太好了。)

由于

2 个答案:

答案 0 :(得分:2)

已更新以添加路线 -

答案是嵌套连接。这个概念是

  1. 获取一系列不同的obs和rbs
  2. 加入原始数据,其中ob = ob和lane = rb
  3. 代码如下:

    select * from table_name as a
    inner join
    (select route, ob, rb from table_name
    group by route, ob, rb) as b
    on a.ob = b.ob
    and 
    a.lane = b.rb
    and 
    a.route = b.route
    

    我已经使用临时表here做了一个示例,因此您可以看到它的实际效果。

    请注意,如果您的数据很大,则应考虑在连接中确保您的dist键。这可以确保redshift知道不需要在不同的计算节点之间连接任何行,因此它可以执行多个本地连接,因此效率更高。

答案 1 :(得分:1)

几种方式(声明很简单但在较大的集合上通常较慢)

select * 
from table
where lane in (select rb from table)

或(我发现在较大的集合上存在得更快,但同时尝试两者)

select * 
from table
where exists (select 'x' from table t_inner 
              where t_inner.rb = table.lane)

无论哪种方式在rb列上创建速度

的索引