首页 > 解决方案 > SQL Server 2008:加入 3 个表并从子表中针对每个父记录选择最后输入的记录

问题描述

我有以下 3 个表,最后输入原因表中的原因代码与索赔表中的每个索赔号相对应

原因:

Rid  |chargeid|  enterydate    user   reasoncode
-----|--------|-------------|--------|----------
1    | 210    | 04/03/2018  | john   | 99 
2    | 212    | 05/03/2018  | juliet | 24
5    | 212    | 26/12/2018  | umar   | 55 
3    | 212    | 07/03/2018  | borat  | 30
4    | 211    | 03/03/2018  | Juliet | 20
6    | 213    | 03/03/2018  | borat  | 50
7    | 213    | 24/12/2018  | umer   | 60
8    | 214    | 01/01/2019  | john   | 70

收费:

chargeid |claim# | amount 
---------|-------|---------
210      | 1     | 10
211      | 1     | 24.2
212      | 2     | 5.45
213      | 2     | 76.30
214      | 1     | 2.10

索赔:

claimno | Code  | Code 
--------|-------|------
1       | AH22  | AH22 
2       | BB32  | BB32

预期的结果是这样的:

claimno | enterydate  | user   | reasoncode
--------|-------------|--------|-----------
1       | 01/01/2019  | john   | 70
2       | 26/12/2018  | umer   | 55

我已经应用了许多解决方案,但没有运气。以下是我尝试使用 SQL Server 2008 的最新解决方案,但结果仍然不正确。

With x As  
 (  
select r.chargeid,r.enterydate,ch.claimno from charges ch
join (select chargeid,max(enterydate) enterydate,user from Reasons group by chargeid) r on r.chargeid = ch.chargeid
)
select x.*,r1.user, r1.reasoncode from x
left outer join Reasons r1 on r1.chargeid = x.chargeid and r1.enterydate = x.enterydate
--group by x.claimno

标签: sqlsql-serversql-server-2008maxjointable

解决方案


您可以尝试使用row_number()

select * from
(
select r.chargeid,r.enterydate,ch.claimno,user,reasoncode,
row_number() over(partition by ch.claimno order by r1.enterydate desc) as rn 
from charges ch left outer join Reasons r1 on r1.chargeid = ch.chargeid 
)A where rn=1

推荐阅读