Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 通过在条件下查找最长日期与另一个表联接_Sql_Date_Join_Teradata_Greatest N Per Group - Fatal编程技术网

Sql 通过在条件下查找最长日期与另一个表联接

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

编辑:我正在使用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 = (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