Sql 如何使用top 1在子查询中获得两列?
事情是这样的。我有两张桌子: 表A:Sql 如何使用top 1在子查询中获得两列?,sql,database,join,subquery,amazon-redshift,Sql,Database,Join,Subquery,Amazon Redshift,事情是这样的。我有两张桌子: 表A: id col1 date_x A xxxx 2020-02-02 B yyyy 2020-02-02 C zzzz 2020-02-02 表B id col2 date_y A yyyy 2020-01-02 A yyyy 2020-02-02 A yyyy 2020-03-02 我想在date_y是可能的最高值时带来col2,但它必须低于date
id col1 date_x
A xxxx 2020-02-02
B yyyy 2020-02-02
C zzzz 2020-02-02
表B
id col2 date_y
A yyyy 2020-01-02
A yyyy 2020-02-02
A yyyy 2020-03-02
我想在date_y是可能的最高值时带来col2,但它必须低于date_x
这就是我所做的:
select *,
(
select top 1 col2
from table_B
where table_B.date_y < a.date_x
and table_B.id = a.id
) as col2
from table_A a
现在,我还想带上date_y,以便进行验证
这样做的最佳方式是什么?我想再创建一个精选的前1名。。。但这似乎效率很低。另一个联接也会效率低下。您可以根据自己的条件联接表,并使用MAX和FIRST_VALUE窗口函数来获取日期y和col2值: 如果只需要两个表中的匹配行,可以将左连接更改为内部连接。
请参阅。您使用相关子查询的方法是可以的,并且红移支持top,尽管我更喜欢limit,但在其他数据库中更广泛地支持top 但是,您在子查询中缺少ORDERBY子句——如果没有它,您将从满足where子句的查询中得到一个不可预测的行,这不是您想要的 我建议:
select
a.*,
(
select col2
from table_B b
where b.date_y < a.date_x and b.id = a.id
order by b.date_y desc
limit 1
) as col2
from table_A a
关于性能,考虑Table上的索引,DATEYY,COL2.
,嗯,我没有遇到任何错误。@一匹没有名字的马,不知道postgresql如何解释上面的代码,但是代码运行得很好,这是Amazon红移,不是postgresql。虽然它们有一些古老的共同根,但它们与productssory有着本质上的不同,这一点仍然是新的。我们得到了一个错误:带有orderby子句的聚合窗口函数需要一个frame子句;表B中的同一id是否有重复的日期?在这种情况下,如果在多行中可以找到可能的最高日期,您想要哪一个col2值?@DumbML是否有不接受答案的原因?select
a.*,
(
select col2
from table_B b
where b.date_y < a.date_x and b.id = a.id
order by b.date_y desc
limit 1
) as col2
from table_A a