2015-01-02 27 views
1

問題:如何返回下面付款排名查詢中前5個值的AVG。返回查詢結果中前5個值的AVG

數據庫:的Oracle 11g

當前查詢

select distinct pye.payeeid, pay.value, 
dense_rank() over (partition by bu.name order by pay.value DESC) as "Payment Ranking" 

from cs_period per, cs_payee pye, cs_payment pay, cs_businessunit bu 

where per.name = 'August 2014' 
and pye.payeeseq = pay.payeeseq 
and pay.businessunitmap = bu.mask 
and pye.effectiveenddate = to_date('01/01/2200','dd/mm/yyyy') 
and pye.removedate = to_date('01/01/2200','dd/mm/yyyy') 
and per.periodseq = pay.periodseq 
order by pay.value DESC 

結果

enter image description here

+0

快速的問題 - 你想在RANK()方面或在DENSE_RANK()方面的前5名?我問的原因是可以有超過5行的DENSE_RANK()爲5或更低,所以如果你想根據你的「支付排名」計算前5,那麼基於ROWNUM的解決方案將不起作用。 –

+0

無論獨特性如何,我都需要前5名的AVG。例如,假設{500,400,400,300,200,200,100}中的前7位,我將計算500,400,400,300,200中的前5位AVG。這是DENSE_RANK的正確用法嗎?謝謝! – jdgaub

+0

好吧,那麼你想要使用'ROWNUM'而不是'DENSE_RANK()'的計算值的解決方案。在這種情況下'DENSE_RANK()'是否適合真正滿足您的業務需求! –

回答

1

我假設你按(您使用的DENSE_RANK()代替RANK()ROW_NUMBER())「支付排名」希望的前5名:

SELECT AVG(value) FROM (
    select distinct pye.payeeid, pay.value 
     , dense_rank() over (partition by bu.name order by pay.value DESC) as payment_ranking 
    from cs_period per, cs_payee pye, cs_payment pay, cs_businessunit bu 
    where per.name = 'August 2014' 
     and pye.payeeseq = pay.payeeseq 
     and pay.businessunitmap = bu.mask 
     and pye.effectiveenddate = to_date('01/01/2200','dd/mm/yyyy') 
     and pye.removedate = to_date('01/01/2200','dd/mm/yyyy') 
     and per.periodseq = pay.periodseq 
) WHERE payment_ranking <= 5 

注意,我所做的就是把你的查詢和使用它作爲一個子查詢,增加一個WHERE條款來限制排名前五的付款。

3
select avg(payment) 
from 
(
    <your query here> 
) 
where rownum <= 5 

假定您保持查詢中所示的順序。