On Thu, Dec 18, 2014 at 2:27 PM, Danilo Silva <[email protected]>
wrote:
>
> Pessoal, é possível utilizar window function para "melhorar" a select
> abaixo:?
>
> SELECT
> (SELECT COUNT(*) FROM orcamento_venda WHERE (orv_codemp = 1) AND
> (orv_codfilial = 1)) AS totorv
> , (SELECT COUNT(*) FROM orcamento_venda WHERE (orv_codemp = 1) AND
> (orv_codfilial = 1) AND (orv_codsituacao = 5)) AS total
> , (SELECT string_agg(orv_codorcamento::text,',') FROM orcamento_venda
> WHERE (orv_codemp = 1) AND (orv_codfilial = 1) AND (orv_codsituacao = 5))
> AS codigos
> , (ROUND((((SELECT COUNT(*) FROM orcamento_venda WHERE (orv_codemp = 1)
> AND (orv_codfilial = 1) AND (orv_codsituacao = 5)) * 100)::numeric /
> (SELECT COUNT(*) FROM orcamento_venda WHERE (orv_codemp = 1) AND
> (orv_codfilial = 1))::numeric),2)) AS percentual
>

Não me parece o caso para WINDOW FUNCTION, parece-me o caso para um CASE
dentro das funções de agregação:

    SELECT
        count(CASE WHEN (orv_codemp = 1) AND (orv_codfilial = 1) END) AS
totorv,
        count(CASE WHEN (orv_codemp = 1) AND (orv_codfilial = 1) AND
(orv_codfilial = 1) END) AS total,
        ... -- adapte os demais
    FROM orcamento_venda
    WHERE (orv_codemp = 1) AND (orv_codfilial = 1) AND ... /* outros
filtros que casam com todos */

Já celebrando o lançamento de hoje, algumas horas atrás, da versão 9.4, o
mesmo ficaria assim na nova versão somente:

    SELECT
        count(*) FILTER(WHERE (orv_codemp = 1) AND (orv_codfilial = 1)) AS
totorv,
    ...

Em termos de performance, usar o CASE ou a cláusula FILTER não tem
diferença, mas a sintaxe é bem mais organizada... ;-)

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