通过查找条件下的最大日期加入另一个 table

Joining with another table by looking for maximum date under a criteria

编辑:我正在使用 teradata sql 助手

我有两个表 TABLE_1 和 TABLE_2

TABLE_1:

TABLE_2:

我想加入 TABLE_1 和 TABLE_2 以便我始终获取来自 TABLE_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 = (MAXIMUM DATE FROM TABLE_2)

我不确定你使用的是哪个数据库,但是对于 postgresql

SELECT DISTINCT ON ( TABLE_1.COLUMN_NUM)TABLE_1.COLUMN_NUM, TABLE_2.COLUMN_2 FROM TABLE_1 LEFT JOIN TABLE_2 ON TABLE_1.COLUMN_NUM=TABLE_2.COLUMN_1 ORDER BY TABLE_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
    )   

不过,缺点是它需要在 table_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 服务器需要 select top (1) ... from ... where ... order by ....

此查询将利用 table_2(column_1, date, column_2) 上的索引(索引中列的排序在这里很重要)。

此查询将利用 table_2(column_1, date, column_2) 上的索引(索引中列的排序在这里很重要)。

如果你的数据库支持window函数,你也可以join并使用row_number():

select t1.column_num, t2.column_2
from table_1 t1
left join (
    select t2.*, row_number() over(partition by column_2 order by date desc) rn
    from table_2 t2
) t2 on t2.column_1 = t1.column_num and t2.rn = 1

这与 GMB 的第三个查询相同,只是在连接之前使用 Teradata 专有的 QUALIFY 子句进行过滤:

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