我是第一次在事件流上工作,所以自我加入一个表是我没有做太多大规模的事情。我正在尝试编写 SQL 脚本,以便在用户登录后为我提供聊天大厅的加载时间。下面我有一个 ETL 示例脚本。我想知道是否有更好的方法来加入我所做的。我还考虑将子查询分解为两个单独的表并进行左连接,但不确定哪种方式被认为是最佳和更好的实践。我也想过做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
我上面创建的脚本是使用 PostgreSQL 完成的
您的子查询的等价物是:
from event_stream login join event_stream load on login.session_id = load.session.id
and login.action = 'success'
and load.action = 'loaded'
这更简单,简单有其优点。要查看哪种方式执行得更快,请对其进行测试。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句