我找到了找到下一个事件日期的解决方案,但没有找到包含事件所有数据的解决方案。通过作弊,我可以完成它,但这仅适用于 mysql 并且在 vertica 中失败。
这是我要解决的问题:
我想显示所有事件 a 以及来自 a 之后且不是类型 a 的第一个事件 X 的数据。因此,这里是剪切和粘贴示例,因此您可以使用它来查看实际效果:
CREATE TABLE events (user_id int ,created_at int, event varchar(20));
INSERT INTO events values (0,0, 'a');
INSERT INTO events values (0,1, 'b');
INSERT INTO events values (0,2, 'c');
INSERT INTO events values (0,3, 'a');
INSERT INTO events values (0,4, 'c');
INSERT INTO events values (0,5, 'b');
INSERT INTO events values (0,6, 'a');
INSERT INTO events values (0,7, 'a');
INSERT INTO events values (0,8, 'd');
SELECT * FROM events;
+---------+------------+-------+
| user_id | created_at | event |
+---------+------------+-------+
| 0 | 0 | a |
| 0 | 1 | b |
| 0 | 2 | c |
| 0 | 3 | a |
| 0 | 4 | c |
| 0 | 5 | b |
| 0 | 6 | a |
| 0 | 7 | a |
| 0 | 8 | d |
+---------+------------+-------+
9 rows in set (0.00 sec)
这是我知道如何同时获得的结果,但我似乎也无法获得其中的事件信息:
SELECT user_id, MAX(purchased) AS purchased, spent
FROM (
SELECT
e1.user_id AS user_id, e1.created_at AS purchased,
MIN(e2.created_at) AS spent
FROM events e1, events e2
WHERE
e1.user_id = e2.user_id AND e1.created_at <= e2.created_at AND
e1.Event = 'a' AND e2.Event != 'a'
GROUP BY e1.user_id, e1.created_at
) e3 GROUP BY user_id, spent;
user_id | purchased | spent
---------+-----------+-------
0 | 0 | 1
0 | 3 | 4
0 | 7 | 8
现在,如果我也想要其中的事件类型,它不适用于上面的查询,因为您要么必须使用 group-by 中的 event 字段(不是我们想要的),要么使用聚合(不是我们想要的任何一个)。有趣的是,它在 mysql 中有效,但我认为这是作弊,因为我必须为此使用 vertica,所以它对我没有帮助:
SELECT user_id, MAX(purchased) as purchased, spent, event FROM (
SELECT
e1.User_ID AS user_id,
e1.created_at AS purchased,
MIN(e2.created_at) AS spent,
e2.event AS event
FROM events e1, events e2
WHERE
e1.user_id = e2.user_id AND e1.created_at <= e2.created_at AND
e1.Event = 'a' AND e2.Event != 'a'
GROUP BY
e1.user_id,e1.created_at
) e3 GROUP BY user_id, spent;
+---------+-----------+-------+-------+
| user_id | purchased | spent | event |
+---------+-----------+-------+-------+
| 0 | 0 | 1 | b |
| 0 | 3 | 4 | c |
| 0 | 7 | 8 | d |
+---------+-----------+-------+-------+
3 rows in set (0.00 sec)
对于 vertica,相同的查询会引发错误:错误 2640:列“e2.event”必须出现在 GROUP BY 子句中或用于聚合函数中
什么是让这两个事件与其所有列配对并且不作弊的优雅解决方案,以便在 vertica 或其他不允许作弊的数据库中执行时获得与上面所示相同的结果?在示例数据中,我只需要一个额外的列,即事件类型,但在现实世界中,它将是两列或三列。
请在回答之前使用发布的示例数据进行尝试:)