Tôi có một tình huống tôi nghĩ có thể được giải quyết bằng chức năng cửa sổ nhưng tôi không chắc chắn.
Hãy tưởng tượng bảng sau
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 )
;
Tôi muốn có một nhóm mới ở mỗi thay đổi trên cột id_type. Nhóm thứ nhất của EG từ 7:19:21 đến 7:19:25, bắt đầu và kết thúc thứ 2 lúc 7:19:26, v.v.
Sau khi nó hoạt động, tôi muốn bao gồm nhiều tiêu chí hơn để xác định các nhóm.
Tại thời điểm này, sử dụng truy vấn bên dưới ...
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;
Tôi nhận được kết quả sau:
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
Trong khi tôi muốn:
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
Sau khi tôi giải quyết bước đầu tiên này, tôi sẽ thêm nhiều cột để sử dụng làm quy tắc để phá vỡ các nhóm và những cột khác sẽ không thể thực hiện được.
Phiên bản Postgres: 8.4 (Chúng tôi có Postgres với Postgis, vì vậy không dễ để nâng cấp. Chức năng Postgis thay đổi tên và có những vấn đề khác, nhưng hy vọng chúng tôi đã viết lại mọi thứ và phiên bản mới sẽ sử dụng phiên bản mới hơn 9.X với postgis 2.x)