2015-11-01 55 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