有一个表人
和表PersonRecord
我需要为每个人选择一条记录,即具有最大状态的记录。
状态按C > B > A
排序,一个人可以拥有多个具有不同或相同状态的记录,我需要始终选择更高的状态或第一个(如果此人具有相同状态的记录)。
我进行以下查询以获取订购的行
select ep.personid, ep.persondesc, records.veryimportantcode, records.status
from extperson ep
left join
(
select rownum as rn, v.* from
(
select pr.personid, pr.veryimportantcode, pr.status
from personrecord pr
group by pr.personid, pr.veryimportantcode, pr.status
order by pr.personid,
decode(pr.status,
'C', 1,'B', 2,'A', 3,
4)
) v
) records
on ep.personid = records.personid
它给了我:
我需要
|PERSONID |PERSONDESC|VERYIMPORTANTCODE |STATUS |
|00325465 |Bjork |(null) |(null) |
|00527513 |Paul |ZP-2143540 |A |
|00542369 |Hazard |ZH-7531594 |C |
|0324567 |Jhon |ZJ-2346570 |B |
我尝试使用附加的物化子查询来实现这一点,其中我计算重复次数并使用where (subquerymat.nrorepeat > 1 and rownum = 1) or (subquerymat.nrorepeat = 1 or subquerymat.nrorepeat is null)
进行左连接但不起作用。
这个查询有一个非常重要的规则,我会在视图中的联合的右侧附加此查询,然后我就不能使用存储过程。
答案 0 :(得分:4)
尝试:
select personid, persondesc, veryimportantcode, status
from (select pe.personid,
pe.persondesc,
pr.veryimportantcode,
pr.status,
row_number() over(partition by pe.personid order by pr.status desc,
pr.autoid) as rn
from person pe
left join personrecord pr
on pe.personid = pr.personid)
where rn = 1