Select 与内部联接的最近日期
Select Most Recent Date with Inner Join
运行 试图从类似于下面的表格中提取信息时撞到墙上。不确定如何解决这个问题。
结果应该包含每个 ACCNUM 的最新 TRANSAMT 以及名称和地址。
Select A.ACCNUM, MAX(B.TRANSAMT) as BAMT, B.ADDRESS from
From TableA A inner join TableB on A.ACCNUM = B.ACCNUM
这是我目前所拥有的。任何帮助将不胜感激。
表A
ACCNUM NAME ADDRESS
00001 R. GRANT Miami, FL
00002 B. PAUL Dallas, TX
表B
ACCNUM TRANSAMT TRANSDATE
00001 150 1/1/2015
00001 200 13/2/2015
00002 100 2/1/205
00003 50 18/2/2015
您可以使用 row_number
对每个帐号的行进行排序,最近的在前。
select accnum, amt, name, address
from (
select A.ACCNUM, B.TRANSAMT as BAMT, B.ADDRESS,A.Name,
row_number() over(partition by a.accnum order by b.transdate desc) as rn
From TableA A
inner join TableB on A.ACCNUM = B.ACCNUM
) t
where rn = 1;
请注意,如果您使用的是 MySQL
,这将不起作用。
您可以在大多数数据库中使用 ANSI 标准 row_number()
函数。这允许您进行条件聚合:
select a.accnum, a.name, b.amount, a.address
from tableA a left join
(select b.*, row_number() over (partition by accnum order by transdate desc) as seqnum
from tableB b
) b
on a.accnum = b.accnum and b.seqnum = 1;
注意:我将 join
更改为 left join
。这将保留 tableA
中的所有记录,即使是那些没有匹配项的记录。我不确定这是否是您查询的意图。
这个没有 ROW_NUMBER():
with find_max as(
select acc_name,max(TRANSDATE) as TRANSDATE from talbeB group by acc_name)
select find_max.ACCNUM , A.TRANSAMT ,
find_max.TRANSDATE , B.ADDRESS,B.Name
from tableA as A
join find_max on find_max.ACCNUM=A.ACCNUM and find_max.ACCNUM=A.ACCNUM
join TableB B on A.ACCNUM = B.ACCNUM
首先找到每个 acc_name 的最大日期,然后将两个表连接到它。
将适用于大多数数据库。
运行 试图从类似于下面的表格中提取信息时撞到墙上。不确定如何解决这个问题。
结果应该包含每个 ACCNUM 的最新 TRANSAMT 以及名称和地址。
Select A.ACCNUM, MAX(B.TRANSAMT) as BAMT, B.ADDRESS from
From TableA A inner join TableB on A.ACCNUM = B.ACCNUM
这是我目前所拥有的。任何帮助将不胜感激。
表A
ACCNUM NAME ADDRESS
00001 R. GRANT Miami, FL
00002 B. PAUL Dallas, TX
表B
ACCNUM TRANSAMT TRANSDATE
00001 150 1/1/2015
00001 200 13/2/2015
00002 100 2/1/205
00003 50 18/2/2015
您可以使用 row_number
对每个帐号的行进行排序,最近的在前。
select accnum, amt, name, address
from (
select A.ACCNUM, B.TRANSAMT as BAMT, B.ADDRESS,A.Name,
row_number() over(partition by a.accnum order by b.transdate desc) as rn
From TableA A
inner join TableB on A.ACCNUM = B.ACCNUM
) t
where rn = 1;
请注意,如果您使用的是 MySQL
,这将不起作用。
您可以在大多数数据库中使用 ANSI 标准 row_number()
函数。这允许您进行条件聚合:
select a.accnum, a.name, b.amount, a.address
from tableA a left join
(select b.*, row_number() over (partition by accnum order by transdate desc) as seqnum
from tableB b
) b
on a.accnum = b.accnum and b.seqnum = 1;
注意:我将 join
更改为 left join
。这将保留 tableA
中的所有记录,即使是那些没有匹配项的记录。我不确定这是否是您查询的意图。
这个没有 ROW_NUMBER():
with find_max as(
select acc_name,max(TRANSDATE) as TRANSDATE from talbeB group by acc_name)
select find_max.ACCNUM , A.TRANSAMT ,
find_max.TRANSDATE , B.ADDRESS,B.Name
from tableA as A
join find_max on find_max.ACCNUM=A.ACCNUM and find_max.ACCNUM=A.ACCNUM
join TableB B on A.ACCNUM = B.ACCNUM
首先找到每个 acc_name 的最大日期,然后将两个表连接到它。 将适用于大多数数据库。