2014/1/23 Osvaldo Kussama <[email protected]>

> Em 22/01/14, Antonio Cesar<[email protected]> escreveu:
> > Versão 9.1
> > sim, posso atualizaar sem problema...
> >
> > Em 21/01/2014 19:09, Matheus de Oliveira escreveu:
> >>
> >>
> >>
> >> 2014/1/21 Antonio Cesar <[email protected]
> >> <mailto:[email protected]>>
> >>
> >>     Boa tarde pessoal,
> >>     Estou precisando de um select que retorne os 4 ultimos pedidos de
> >>     cada cliente.
> >>     EX:
> >>         Cliente 001 pedido 10, 15, 18 e 20
> >>         Cliente 002 pedido 11, 12, 13 e 14
> >>
> >>
>
>
> Na 9.1 é possível utilizar window functions com rank().
> Veja o penúltimo exemplo em:
> http://www.postgresql.org/docs/9.1/interactive/tutorial-window.html
>
>
Acho que para o caso a row_number faz mais sentido:

SELECT *
FROM (
        SELECT row_number() OVER(
            PARTITION BY vi.codigo_cliente ORDER BY vi.datahoravenda DESC
        ) AS rn, *
        FROM venda vi
    ) v
WHERE rn <= 4;

Mas meu ponto para a migração para a 9.3 é que a junção com LATERAL é mais
performática para esses casos. E muito mais performática, pois a consulta
acima precisa processar **todos** os registros de venda (na sub-consulta)
para somente depois ficar só com os 4 primeiros e ignorar o restante. É
possível atingir essa performance na 9.1, mas é bem mais "gambiarroso" do
que usando WINDOW FUNTIONs.


Atenciosamente,
-- 
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a