2015-10-22 14:45 GMT-02:00 Rubens José Rodrigues <
[email protected]>:
> Por favor, ajude-me dizendo como eu poderia "marcar" o elemento agrupado
> (campanha, codcet, numcondicao) de maior valor.
>
> Observe abaixo que criei uma coluna "Atendido" para ilustrar como seria o
> resultado esperado, ela não existe na entidade, mas se for necessário posso
> cria-la (pois é uma tabela temporária).
>
> CAMPANHA CODCET NUMCONDICAO CODCATITE VALOR
> ATENDIDO
> Caldo 168g 2163250 1 12249092 5971.00
> SIM
> Caldo 168g 2163250 1 12249091 2512.33
> NAO
> Caldo 168g 3531694 1 12249092 55269.56
> SIM
> Caldo 168g 3531694 1 12249091 14596.32
> NÃO
>
Você quer que o de maior valor tenha ATENDIDO = 'S', certo?
Nesse caso você pode usar window function com subconsulta:
SELECT
t.campanha, t.codcet, t.numcondicao, t.codcatite, t.valor,
CASE
WHEN (row_number() OVER(PARTITION BY t.campanha, t.codcet,
t.numcondicao ORDER BY t.valor DESC)) = 1 THEN 'SIM'
ELSE 'NAO'
END AS atendido
FROM sua_tabela t;
Se quiser conhecer mais sobre window functions, eu escrevi um artigo sobre
isso há um tempo atrás [1][2], espero que esteja claro.
No exemplo acima eu usei a função ROW_NUMBER para enumerar as linhas de
forma decrescente, ou seja, o de maior valor recebe 1, o segundo maior 2, e
assim por diante. Daí peguei o que era igual a 1, garantidamente o de maior
valor.
Um problema desse método é que se tiver dois itens empatados com o maior
valor, apenas um será marcado de forma aleatória. Caso queira marcar ambos,
basta simplesmente usar a função RANK ao invés da ROW_NUMBER.
[1] http://dextra.com.br/window-functions-no-postgresql-parte1/
[2] http://dextra.com.br/window-functions-no-postgresql-parte-2/
Atenciosamente,
--
Matheus de Oliveira
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral