Sql 根据红移中的条件筛选数据

Sql 根据红移中的条件筛选数据,sql,amazon-redshift,Sql,Amazon Redshift,在解决前一个问题时,我又遇到了一个问题: 因此,我有以下数据: 对于每个路由->我只想得到rb中存在ob的那些行。因此,该输出: 我知道这也需要通过临时表来完成。之前我是按照@smb的建议这样做的: select * from table_name as a inner join (select load, rb from table_name group by load, rb) as b on a.load = b.load and a.ob = b.rb 但这个解决方案会给我:

在解决前一个问题时,我又遇到了一个问题: 因此,我有以下数据:

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

我知道这也需要通过临时表来完成。之前我是按照@smb的建议这样做的:

select * from table_name as a
inner join
(select load, rb from table_name
group by load, rb) as b
on a.load = b.load
and 
a.ob = b.rb
但这个解决方案会给我:

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

如果你们能帮忙,那就太好了:)

多谢了(in语句很简单,但在较大的集合中通常较慢)

或者(我发现在更大的集合上存在更快的速度,但尝试两者)


无论哪种方式,都可以在rb列上创建速度索引,并更新为附加路线-

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

  • 获取不同的OB和RB对的列表
  • 连接到原始数据,其中ob=ob和lane=rb
  • 代码如下:

    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
    
    我已经用一个临时表做了一个例子,这样你就可以看到它的作用


    注意,如果你的数据很大,你应该考虑在连接中确定你的DIST键。这确保了redshift知道不需要跨不同的计算节点连接行,因此它可以执行多个本地连接,因此效率更高

    这是红移-没有索引。如果是,可能是排序键,那么您的解决方案对匹配rb相对于ob不敏感。i、 e.rb可能存在于另一个ob上,但不存在于与之匹配的ob上,因此给出不正确的结果。所以你应该在这两个解中加上where ob=ob。这取决于你如何解释这个问题。我不认为这是他想要的。“If lane不存在于rb中”并没有说“If lane不存在于rb中用于该OB”我还有一个问题:@RishabhVerma应用的相同概念只需要将路由添加到查询和连接中。我已经更新了我的答案
    select * 
    from table
    where exists (select 'x' from table t_inner 
                  where t_inner.rb = table.lane)
    
    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