如何使用自定义订单为每个子组选择第一行?

时间:2015-04-06 00:09:46

标签: sql oracle join plsql

有一个表人

Sample of table Person

和表PersonRecord

Sample of Person Record

我需要为每个人选择一条记录,即具有最大状态的记录。 状态按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  

它给了我:

Data ordered

我需要

|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)进行左连接但不起作用。

这个查询有一个非常重要的规则,我会在视图中的联合的右侧附加此查询,然后我就不能使用存储过程。

1 个答案:

答案 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

小提琴测试: http://sqlfiddle.com/#!4/25074/2/0