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