2015-04-06 84 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

相關問題