通过查找条件下的最大日期加入另一个 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
编辑:我正在使用 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