【发布时间】:2025-11-30 03:05:02
【问题描述】:
我有一个应用事件数据表。每行都有一个 user_id、一个时间戳、一个 page_id、一个 event_name 和其他字段。我现在关心的事件是 page_open 和 button_click 事件,但还有 10 种其他事件类型可能发生在这两者之间,比如滚动。用户可能会多次打开同一个页面,但只是经常单击页面上的一个按钮,如下例所示。
user_id timestamp page_id event_name
------- ---------- ------- --------------
71 12:00:34 307 page_open
88 13:01:44 307 page_open
71 13:02:09 307 page_open
71 13:02:11 307 scroll
71 13:04:41 307 page_open
71 13:04:42 307 scroll
71 13:04:45 307 button_click_a
71 13:08:30 307 page_open
88 13:09:01 307 button_click_b
对于每个用户的每个 page_open 事件,我想要一个额外的列来告诉我最终是否单击了按钮。我没有要使用的页面“会话”,因此我必须查找在 button_click 时间戳之前发生的最大 page_open 时间戳。换句话说,我想把上面的表格变成下面的表格
user_id timestamp page_id event_name button_event
------- ---------- ------- ---------- --------------
71 12:00:34 307 page_open NULL
88 13:01:44 307 page_open button_click_b
71 13:02:09 307 page_open NULL
71 13:04:41 307 page_open button_click_a
71 13:08:30 307 page_open NULL
我尝试将 page_open 和 button_click 事件分成两个表,并在 user_id 和 page_id 上执行LEFT JOIN,如下所示,但当然这不起作用,因为它将按钮点击与具有该 page_id 的所有 page_opens 匹配.我只想将按钮单击与其对应的 page_open 事件相匹配。
SELECT
a.user_id,
a.timestamp,
a.page_id,
a.event_name,
b.event_name AS button_event
FROM
(SELECT * FROM events WHERE event_name = 'page_open') a
LEFT JOIN
(SELECT * FROM events WHERE event_name = 'button_click_a' OR event_name = 'button_click_b') b
ON
a.user_id = b.user_id AND
a.page_id = b.page_id
;
我不熟悉使用这样的事件数据。你能提供的任何帮助都会很棒。解决这个问题的正确方法是什么?
【问题讨论】:
-
请标记您正在使用的数据库。 (有版本也不错)
标签: sql hive hql window-functions gaps-and-islands