【发布时间】:2015-11-14 08:01:22
【问题描述】:
我在 Postgres 9.3 中有以下 event 表:
CREATE TABLE event (
event_id integer PRIMARY KEY,
user_id integer,
event_type varchar,
event_time timestamptz
);
我的目标是检索所有user_id 的任何事件之间(或上次事件和当前时间之间)至少有 30 天的间隔。另一个复杂情况是,我只希望有这些差距之一的用户出现在他们执行某个event_type'convert' 之后的时间。这怎么能轻松完成?
event 表中的一些示例数据可能如下所示:
INSERT INTO event (event_id, user_id, event_type, event_time)
VALUES
(10, 1, 'signIn', '2015-05-05 00:11'),
(11, 1, 'browse', '2015-05-05 00:12'), -- no 'convert' event
(20, 2, 'signIn', '2015-06-07 02:35'),
(21, 2, 'browse', '2015-06-07 02:35'),
(22, 2, 'convert', '2015-06-07 02:36'), -- only 'convert' event
(23, 2, 'signIn', '2015-08-10 11:00'), -- gap of >= 30 days
(24, 2, 'signIn', '2015-08-11 11:00'),
(30, 3, 'convert', '2015-08-07 02:36'), -- starting with 1st 'convert' event
(31, 3, 'signIn', '2015-08-07 02:36'),
(32, 3, 'convert', '2015-08-08 02:36'),
(33, 3, 'signIn', '2015-08-12 11:00'), -- all gaps below 30 days
(33, 3, 'browse', '2015-08-12 11:00'), -- gap until today (2015-08-20) too small
(40, 4, 'convert', '2015-05-07 02:36'),
(41, 4, 'signIn', '2015-05-12 11:00'); -- gap until today (2015-08-20) >= 30 days
预期结果:
user_id
--------
2
4
【问题讨论】:
-
我想我有。但是您能否也包括您的期望输出?
-
另外请下次尝试加入一个小提琴,帮助我们解决您的问题SQL Fiddle
-
所以不要列出根本没有
'convert'事件的用户? -
我的猜测是事件
convert--- 事件 A(30 分钟)事件 B -
因此,对于您的示例数据,实际上只有
event_id0005可以满足这两个要求,因此您的结果集将是user_id2222。对吗?
标签: sql postgresql time-series window-functions gaps-and-islands