2015-10-22 14:45 GMT-02:00 Rubens José Rodrigues <
rubens.rodrig...@batistarepresentacoes.com>:

> 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
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a