Eu tenho uma situação que acho que pode ser resolvida usando a função de janela, mas não tenho certeza.
Imagine a seguinte tabela
CREATE TABLE tmp (
date timestamp
, id_type integer
) ;
INSERT INTO tmp (date, id_type)
VALUES
( '2017-01-10 07:19:21.0', 3 ),
( '2017-01-10 07:19:22.0', 3 ),
( '2017-01-10 07:19:23.1', 3 ),
( '2017-01-10 07:19:24.1', 3 ),
( '2017-01-10 07:19:25.0', 3 ),
( '2017-01-10 07:19:26.0', 5 ),
( '2017-01-10 07:19:27.1', 3 ),
( '2017-01-10 07:19:28.0', 5 ),
( '2017-01-10 07:19:29.0', 5 ),
( '2017-01-10 07:19:30.1', 3 ),
( '2017-01-10 07:19:31.0', 5 ),
( '2017-01-10 07:19:32.0', 3 ),
( '2017-01-10 07:19:33.1', 5 ),
( '2017-01-10 07:19:35.0', 5 ),
( '2017-01-10 07:19:36.1', 5 ),
( '2017-01-10 07:19:37.1', 5 );
Eu gostaria de ter um novo grupo a cada mudança de valor na coluna id_type
. EG 1º grupo das 7:19:21 às 7:19:25, 2º largada e chegada às 7:19:26, e assim sucessivamente.
Neste momento, usando a consulta abaixo ...
SELECT distinct
min(min(date)) over w as begin,
max(max(date)) over w as end,
id_type
FROM tmp
GROUP BY id_type
WINDOW w AS (PARTITION BY id_type)
ORDER BY begin;
Obtenho o seguinte resultado:
begin end id_type
2017-01-10 07:19:21.0 2017-01-10 07:19:32.0 3
2017-01-10 07:19:26.0 2017-01-10 07:19:37.1 5
Enquanto eu gostaria:
begin end id_type
2017-01-10 07:19:21.0 2017-01-10 07:19:25.0 3
2017-01-10 07:19:26.0 2017-01-10 07:19:26.0 5
2017-01-10 07:19:27.1 2017-01-10 07:19:27.1 3
2017-01-10 07:19:28.0 2017-01-10 07:19:29.0 5
2017-01-10 07:19:30.1 2017-01-10 07:19:30.1 3
2017-01-10 07:19:31.0 2017-01-10 07:19:31.0 5
2017-01-10 07:19:32.0 2017-01-10 07:19:32.0 3
2017-01-10 07:19:33.1 2017-01-10 07:19:37.1 5
Quando isso funcionar, quero incluir mais critérios para definir grupos, e esses outros serão anuláveis.
Versão do Postgres: 8.4. Temos Postgres com PostGis, então não é fácil atualizar. As funções do PostGis mudam de nome e há outros problemas, mas já estamos reescrevendo tudo e a nova versão usará uma versão mais recente 9.X com PostGis 2.x.