Bom dia Pessoal,
Estou precisando de ajuda para agrupar os dados de uma consulta por um
periodo qualquer de tempo. EX: 15 minutos ou 3 dias ou 5 horas, entende,
qualquer periodo de tempo.
Fiz uma função usando plpgsql que resolve meu problema.
Porém comparando a performance dela com agrupar usando o date_trunc do
postgresql o resultado é muito ruim.
Ex: com o date_trunc('hour',timestamp) resultado em 78ms
com minha function resultado em 4 segundos.
Alguém pode me ajudar informando se ha algo disponível no postgresql para
fazer esse tipo de agrupamento, ou se somente com funções personalizadas
isso é possível.
Segue o código da função para sugestões de melhoria de performance.
CREATE OR REPLACE FUNCTION "public"."date_interval" (p_intervalo text, p_dh
timestamp) RETURNS TIMESTAMP WITHOUT TIME ZONE AS
$body$
DECLARE
periodo integer;
intervalosuperior text;
intervaloatual text;
dh timestamp;
valor integer;
retornotext text;
BEGIN
dh:=p_dh;
intervaloatual:=split_part(p_intervalo,':',1);
periodo:=split_part(p_intervalo,':',2);
case intervaloatual
when 'minute' then intervalosuperior := 'hour';
when 'hour' then intervalosuperior := 'day';
when 'day' then intervalosuperior := 'month';
when 'month' then intervalosuperior := 'year';
else raise exception 'tipo de intervalo informado nao suportado';
end case;
valor:=date_part(intervaloatual,dh);
valor:=cast((valor/periodo) as integer) * periodo;
dh:=date_trunc(intervalosuperior,dh);
retornotext:= cast(valor as text) || ' '|| intervaloatual;
execute 'select timestamp '||''''||dh||''''|| '+ interval
'||''''||retornotext||'''' into dh;
return dh;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;
Obrigado pessoal,
Edson Souza
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral