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...).
