Quem sou eu

Minha foto
Programador por profissão, formação e opção! Interessado em tudo relacionado a computadores, menos manutenção de hardware! Linguagens (interesse e trabalho): Java, C#, C/C++, Python, Ruby, Haskell. Atualmente trabalhando como Desenvolvedor (maior parte do tempo em soluções ASP.NET)

sexta-feira, 28 de setembro de 2012

Select no PostgreSQL agrupando resultados por data.

Mais uma postagem da série do Pequeno Guia do Mochileiro do PostgreSQL.

Me pergutaram no serviço, como agrupar os resultados de um select por hora, ignorando as informações de minuto/segundo.

Segue abaixo o exemplo de como fazer esse agrupamento:
experiments=# create table test_group_date(count real, date timestamp);
CREATE TABLE
experiments=# insert into test_group_date(count, date) values (1, TIMESTAMP '2001-02-16 20:38:40');
INSERT 0 1
experiments=# insert into test_group_date(count, date) values (2, TIMESTAMP '2001-02-16 21:38:40');
INSERT 0 1
experiments=# insert into test_group_date(count, date) values (2, TIMESTAMP '2001-02-16 21:58:40');
INSERT 0 1
experiments=# insert into test_group_date(count, date) values (2, TIMESTAMP '2001-02-16 21:59:40');
INSERT 0 1
experiments=# select * from test_group_date;
 count |        date
-------+---------------------
     1 | 2001-02-16 20:38:40
     2 | 2001-02-16 21:38:40
     2 | 2001-02-16 21:58:40
     2 | 2001-02-16 21:59:40
(4 rows)

experiments=# select sum(count), date_trunc('hour', date) from test_group_date group by date_trunc('hour', date)
experiments-# ;
 sum |     date_trunc
-----+---------------------
   6 | 2001-02-16 21:00:00
   1 | 2001-02-16 20:00:00
(2 rows)

experiments=# select agrupado_por_hora.hora, agrupado_por_hora.max_val - agrupado_por_hora.min_val
from ( select date_trunc('hour', date) hora, min(date) min_val, max(date) max_val
       from test_group_date
       group by date_trunc('hour',date)
     ) as agrupado_por_hora
;
        hora         | ?column?
---------------------+----------
 2001-02-16 21:00:00 | 00:21:00
 2001-02-16 20:00:00 | 00:00:00
(2 rows)

experiments=#

Para mais detalhes sobre a função date_trunc e outras funções de data. Acesse a documentação do PostgreSQL.

Note que além da date_trunc existe a função date_part. A diferença é que a date_part retorna apenas o pedaço solicitado (ou seja, apenas a hora ou minuto, etc...).