Tôi có bảng đại diện cho việc sử dụng sản phẩm, giống như nhật ký. Việc sử dụng sản phẩm được ghi lại dưới dạng nhiều dấu thời gian, tôi muốn đại diện cho cùng một dữ liệu bằng cách sử dụng các phạm vi thời gian.Thu gọn nhiều hàng có dấu thời gian liền kề
Nó trông giống như thế này (PostgreSQL 9.1):
userid | timestamp | product
-------------------------------------
001 | 2012-04-23 9:12:05 | foo
001 | 2012-04-23 9:12:07 | foo
001 | 2012-04-23 9:12:09 | foo
001 | 2012-04-23 9:12:11 | barbaz
001 | 2012-04-23 9:12:13 | barbaz
001 | 2012-04-23 9:15:00 | barbaz
001 | 2012-04-23 9:15:01 | barbaz
002 | 2012-04-24 3:41:01 | foo
002 | 2012-04-24 3:41:03 | foo
Tôi muốn sụp đổ hàng có chênh lệch thời gian với thời gian trước đó là ít hơn một đồng bằng (nói: 2 giây), và nhận được các bắt đầu thời gian và thời gian kết thúc, như thế này:
userid | begin | end | product
----------------------------------------------------------
001 | 2012-04-23 9:12:05 | 2012-04-23 9:12:09 | foo
001 | 2012-04-23 9:12:11 | 2012-04-23 9:12:13 | barbaz
001 | 2012-04-23 9:15:00 | 2012-04-23 9:15:01 | barbaz
002 | 2012-04-24 3:41:01 | 2012-04-24 3:41:03 | foo
Xin lưu ý rằng việc sử dụng liên tiếp của cùng một sản phẩm được chia thành hai hàng nếu việc sử dụng của họ là hơn del ta (2 giây, trong ví dụ này) cách nhau.
create table t (userid int, timestamp timestamp, product text);
insert into t (userid, timestamp, product) values
(001, '2012-04-23 9:12:05', 'foo'),
(001, '2012-04-23 9:12:07', 'foo'),
(001, '2012-04-23 9:12:09', 'foo'),
(001, '2012-04-23 9:12:11', 'barbaz'),
(001, '2012-04-23 9:12:13', 'barbaz'),
(001, '2012-04-23 9:15:00', 'barbaz'),
(001, '2012-04-23 9:15:01', 'barbaz'),
(002, '2012-04-24 3:41:01', 'foo'),
(002, '2012-04-24 3:41:03', 'foo')
;
Đó là ... đẹp! Hoạt động chính xác như dự định, cảm ơn! –