从事件流中自我加入日期的有效方法是什么?

What is the efficient way of self joining date from an event stream?

我是第一次在事件流上工作,所以自己加入 table 是我没有做过太多大规模的事情。我正在尝试编写 SQL 脚本,以便在用户登录后给我加载聊天室的时间。下面我有一个 ETL 示例脚本。我想知道是否有更好的方法来加入我所做的事情。我还考虑过将子查询分成两个单独的 table 并进行左连接,但不确定哪种方式被认为是最佳和更好的做法。我也想过做CTE

DROP TABLE IF EXISTS event_stream;
create table event_stream
(
   event varchar(50),
   action varchar(100),
   userid int,
   session_id int,
   date timestamp
);


INSERT INTO event_stream(event, action, userid, date,session_id) VALUES
('login', 'success', 1, '2017-08-15 12:30',100),
('chatlobby','loaded', 1, '2017-08-15 12:30:10',100),
('entered_chatroom','chatroom1',1,'8/15/2017 12:31',100),
('login', 'success', 54, '2017-08-15 01:30',101),
('chatlobby','loaded', 54, '2017-08-15 01:30:05',101),
('entered_chatroom','chatroom2',54,'8/15/2017 01:31',101);

Select a.userid, a.session_id, b.date - a.date as load_time
from 
   (Select * from event_stream where event = 'login' and action='success') a
JOIN
   (Select * from event_stream where event = 'chatlobby' and action = 'loaded') b 
ON a.session_id = b.session_id

我上面创建的脚本是使用 Postgre 完成的SQL

你的子查询的等价物是:

from event_stream login join event_stream load on login.session_id = load.session.id
and login.action = 'success' 
and load.action = 'loaded'

这样比较简单,简单也有好处。要查看哪种方式执行得更快,请对其进行测试。