2015-04-06 75 views
1

具有桌子人如何使用自定义顺序为每个子组选择第一行?

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)左加入,但不起作用。

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

回答

3

尝试:

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

+0

ORA-00904: “RN”:ungültigerBezeichner 00904. 00000 - “%s的:无效的标识符” – 2017-03-05 23:29:03

+0

@ florian.isopp做你有问题吗?如果你得到这个错误,那么你可能没有在你的内联视图中显示的分析功能。事实上,上面的内嵌视图返回了一个名为'rn'的列。 – 2017-03-07 00:38:14

相关问题