从事件流中自我加入日期的有效方法是什么?
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'
这样比较简单,简单也有好处。要查看哪种方式执行得更快,请对其进行测试。
我是第一次在事件流上工作,所以自己加入 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'
这样比较简单,简单也有好处。要查看哪种方式执行得更快,请对其进行测试。