sql—通过在条件下查找最长日期来连接另一个表

wr98u20j  于 2021-07-29  发布在  Java
关注(0)|答案(4)|浏览(424)

编辑:我正在使用teradata sql assistant
我有两张table表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 = (MAXIMUM DATE FROM TABLE_2)
klh5stk1

klh5stk11#

您要编写的查询似乎是:

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中使用,而sqlserver需要 select top (1) ... from ... where ... order by ... .
此查询将利用上的索引 table_2(column_1, date, column_2) (这里索引中列的顺序很重要)。
此查询将利用上的索引 table_2(column_1, date, column_2) (这里索引中列的顺序很重要)。
如果您的数据库支持窗口函数,您还可以 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
inn6fuwd

inn6fuwd2#

我不知道你用的是哪一个数据库,但用的是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

2exbekwf

2exbekwf3#

您可以尝试以下语句:

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;
aemubtdh

aemubtdh4#

这与gmb的第3个查询相同,只是在使用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

相关问题