选择内部加入的最近日期

时间:2015-09-21 20:09:56

标签: sql select max min

尝试从类似下面的表格中提取信息时遇到问题。不知道如何处理这个问题。

结果应该包含每个ACCNUM的最新TRANSAMT以及NAME和地址。

   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

3 个答案:

答案 0 :(得分:1)

您可以在大多数数据库中使用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中的所有记录,即使是那些没有匹配的记录。我不确定这是否是您的查询意图。

答案 1 :(得分:0)

您可以使用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,则无效。

答案 2 :(得分:0)

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