尝试从类似下面的表格中提取信息时遇到问题。不知道如何处理这个问题。
结果应该包含每个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
答案 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的最大日期,将两个表连接到它。 将适用于大多数数据库。