2015-11-01 57 views
3

我有兩個表:hospede和hospedagem。 我想限制結果爲3行的最高值,而不僅僅是「限制3」。因此如果「總和」的某些結果具有相同的值,則應該增加最大結果行。限制行數但增加,如果結果的值等於

當前的結果:

"Sao Paulo";810.40 
"Porto Alegre";810.40 
"Cascavel";740.40 
"Ijui";680.40 
"Itapema";540.00 

預期的結果:

"Sao Paulo";810.40 
"Porto Alegre";810.40 
"Cascavel";740.40 
"Ijui";680.40 

愚見查詢:

select  cidade "Cidade", 
      sum(valorDiaria * (dataSaida - dataEntrada)) "Valor Total" 
from  hospedagem h1, hospede h2 
where  h1.codHospede = h2.codHospede 
and   CURRENT_DATE - interval '3 months' < dataEntrada 
group by "Cidade" 
order by "Valor Total" desc 

回答

3

使用dense_rank()rank()取決於您希望如何處理關係:

select "Cidade", "Valor Total" 
from (select cidade as "Cidade", 
      sum(valorDiaria * (dataSaida - dataEntrada)) as "Valor Total", 
      dense_rank() over (order by sum(valorDiaria * (dataSaida - dataEntrada)) desc) as seqnum 
     from hospedagem h1 join hospede h2 
      on h1.codHospede = h2.codHospede 
     where CURRENT_DATE - interval '3 months' < dataEntrada 
     group by "Cidade" 
    ) hh 
where seqnum <= 3; 

如果你的數據是:

100 
100 
100 
100 
90 
90 
80 
79 

然後dense_rank()將返回前七行。 rank()只會返回前四個。 row_number()會返回第一個3.

+0

它的工作原理!你是男人!謝謝!!! – Yonathan