Sql 根据红移中的条件筛选数据
在解决前一个问题时,我又遇到了一个问题: 因此,我有以下数据: 对于每个路由->我只想得到rb中存在ob的那些行。因此,该输出: 我知道这也需要通过临时表来完成。之前我是按照@smb的建议这样做的: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 但这个解决方案会给我:
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列上创建速度索引,并更新为附加路线- 答案是嵌套联接。这个概念是
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