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 的最大日期,然后将两个表连接到它。 将适用于大多数数据库。