Em 02-05-2013 16:04, Flavio Henrique Araque Gurgel escreveu:
    Isto aqui funcionou pra mim:

    SELECT date_trunc('day', a.datahora), a.datahora, *min(a.valor)*
    FROM dados a GROUP BY 1,2
    HAVING *min(valor)* <= (SELECT min(valor) FROM dados b WHERE
    date_trunc('day', b.datahora)=date_trunc('day', a.datahora)) ORDER
BY 2;


Uma curiosidade, a consultada abaixo deu o mesmo resultado para o
exemplo, mas fica a dúvida se ela realmente retorna o mesmo resultado da
que voce propôs, observe que tirei o "*min(a.valor)*" do primeiro select
e do HAVING:

SELECT date_trunc('day', a.datahora), a.datahora, a.valor FROM dados a
GROUP BY 1,2
HAVING a.valor <= (SELECT min(valor) FROM dados b WHERE
date_trunc('day', b.datahora)=date_trunc('day', a.datahora)) ORDER BY 2;

Analisando sua consulta, acho que dá na mesma em termos de resultado e
plano de execução (com este volume de dados de teste), com uma operação
a menos (a função min sobre valor), ou seja, sua consulta vai consumir
um tico a menos de CPU, podendo utilizar um eventual índice simples
sobre a coluna valor (ao invés de um índice baseado em função) quando
tiver mais linhas na tabela.

Resumindo, sua consulta final parece mais interessante pensando num
prazo mais longo, com o mesmo resultado prático.

Um detalhe. Fazendo como abaixo fica mais "barato" ainda:
SELECT date_trunc('day', a.datahora), a.datahora, a.valor FROM dados a WHERE valor <= (SELECT min(valor) FROM dados b WHERE date_trunc('day', b.datahora)=date_trunc('day', a.datahora)) ORDER BY 2;

Misturando minha ideia com a sua, mesmíssimo resultado.

[]s

__________________________________
Flavio Henrique A. Gurgel
Líder de Projetos Especiais
Consultoria, Projetos & Treinamentos 4LINUX
Tel1: +55-11.2125-4747 ou 2125-4748
www.4linux.com.br
email: [email protected]
______________________________
FREE SOFTWARE SOLUTIONS
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a