Sql 通过在条件下查找最长日期与另一个表联接
编辑:我正在使用teradata sql assistant 我有两张桌子表1和表2 表1: 表2: 我想左键联接表1和表2,这样我总是从表2中获取最近日期的记录。最终结果应该如下所示: 如何指定联接条件Sql 通过在条件下查找最长日期与另一个表联接,sql,date,join,teradata,greatest-n-per-group,Sql,Date,Join,Teradata,Greatest N Per Group,编辑:我正在使用teradata sql assistant 我有两张桌子表1和表2 表1: 表2: 我想左键联接表1和表2,这样我总是从表2中获取最近日期的记录。最终结果应该如下所示: 如何指定联接条件 SELECT DISTINCT TABLE_1.COLUMN_NUM, TABLE_2.COLUMN_2 FROM TABLE_1 LEFT JOIN TABLE_2 ON TABLE_1.COLUMN_NUM=TABLE_2.COLUMN_1 AND TABLE_2.DATE = (MAX
SELECT DISTINCT
TABLE_1.COLUMN_NUM,
TABLE_2.COLUMN_2
FROM TABLE_1
LEFT JOIN TABLE_2
ON TABLE_1.COLUMN_NUM=TABLE_2.COLUMN_1
AND TABLE_2.DATE = (MAXIMUM DATE FROM TABLE_2)
我不确定您使用的是哪个数据库,但用于postgresql
选择表1上的DISTINCT(表1.COLUMN)表1.COLUMN\u NUM,表2.COLUMN\u 2从表1左连接表1上的表2.COLUMN\u NUM=表2.COLUMN\u 1按表2.DATE DESC排序您可以尝试以下语句:
With temp AS(Select column_num, column_2, date, max(b.date) OVER (PARTITION BY b.column_1) max_dt
from table_1 a LEFT JOIN table_2 b ON a.column_num = b.column_1)
Select column_num, column_2 from temp
where date = max_dt;
您想要编写的查询似乎是:
select t1.column_num, t2.column_2
from table_1 t1
left join table_2 t2
on t2.column_1 = t1.column_num
and t2.date = (
select max(t22.date) from table_2 t22 where t22.column_1 = t1.column_1
)
不过,缺点是它需要对表2
进行两次扫描。对于此数据集和预期的结果集,我建议使用带有行限制子句的相关子查询:
select
t1.column_num,
(
select column2
from table_2 t2
where t2.column_1 = t1.column_num
order by t2.date desc
limit 1
) column_2
from table_1 t1
这是一种跨数据库的方法,尽管行限制子句的语法可能会有所不同:上面的方法在MySQL和Postgres中可以使用,而SQL Server希望select top(1)。。。从…起哪里订购人…
此查询将利用表2(列1,日期,列2)
上的索引(此处索引中列的顺序很重要)
此查询将利用表2(列1,日期,列2)
上的索引(此处索引中列的顺序很重要)
如果您的数据库支持窗口功能,您还可以加入并使用行号()
这与GMB的第三个查询相同,只是在加入之前使用Teradata的专有限定条款进行过滤:
select t1.column_num, t2.column_2
from table_1 t1
left join (
select t2.*
from table_2 t2
qualify row_number()
over(partition by column_2
order by date desc) = 1
) t2
on t2.column_1 = t1.column_num
DBMS的名称是什么?。@AGDBMS是Teradata
select t1.column_num, t2.column_2
from table_1 t1
left join (
select t2.*
from table_2 t2
qualify row_number()
over(partition by column_2
order by date desc) = 1
) t2
on t2.column_1 = t1.column_num