SQL 查找最近的活动事件
SQL to find the most recent active event
我有 2 个表、请求和事件。见下文。
requests columns: request_id(primary_key), user_id, request_timestamp.
events columns: event_id(primary_key), user_id, event_start_time, event_end_time
需要注意的一件事是,给定一个用户 ID,所有事件持续时间都是互斥的。
现在我想写一个SQL来连接这两个表并生成如下数据:
request_id, user_id, event_id, event_start_time, event_end_time, request_timestamp
加入时有2个cases/constraints:
如果请求是在事件处于活动状态时发出的,我们应该选择它,即 request_timestamp >= events.start_time AND request_timestamp <= events.end_time
。然后完成
如果没有活动事件,我们需要选择在请求之前结束的事件,即找到与用户关联的所有事件并过滤掉 start_time 大于的事件请求时间。然后 select 与事件 MAX(end_time)
.
我在这上面花了很多时间,但还是做不好。我认为我要解决的问题不是唯一的。
感谢任何帮助。
如果您希望每个请求一个事件,您可以使用相关子查询:
select r.*,
(select e.event_id
from events e
where e.user_id = r.user_id and
e.event_start_time <= request_timestamp
order by (case when request_timestamp between event_start_time and event_end_time then 1 else 2 end),
request_timestamp desc
limit 1
) as event_id
from requests r;
然后您可以 join
返回事件 table 以获取其余信息:
select r.*, e.*
from (select r.*,
(select e.event_id
from events e
where e.user_id = r.user_id and
e.event_start_time <= request_timestamp
order by (case when request_timestamp between event_start_time and event_end_time then 1 else 2 end),
request_timestamp desc
limit 1
) as event_id
from requests r
) r left join
events e
on e.event_id = r.event_id;
我有 2 个表、请求和事件。见下文。
requests columns: request_id(primary_key), user_id, request_timestamp.
events columns: event_id(primary_key), user_id, event_start_time, event_end_time
需要注意的一件事是,给定一个用户 ID,所有事件持续时间都是互斥的。
现在我想写一个SQL来连接这两个表并生成如下数据:
request_id, user_id, event_id, event_start_time, event_end_time, request_timestamp
加入时有2个cases/constraints:
如果请求是在事件处于活动状态时发出的,我们应该选择它,即
request_timestamp >= events.start_time AND request_timestamp <= events.end_time
。然后完成如果没有活动事件,我们需要选择在请求之前结束的事件,即找到与用户关联的所有事件并过滤掉 start_time 大于的事件请求时间。然后 select 与事件
MAX(end_time)
.
我在这上面花了很多时间,但还是做不好。我认为我要解决的问题不是唯一的。
感谢任何帮助。
如果您希望每个请求一个事件,您可以使用相关子查询:
select r.*,
(select e.event_id
from events e
where e.user_id = r.user_id and
e.event_start_time <= request_timestamp
order by (case when request_timestamp between event_start_time and event_end_time then 1 else 2 end),
request_timestamp desc
limit 1
) as event_id
from requests r;
然后您可以 join
返回事件 table 以获取其余信息:
select r.*, e.*
from (select r.*,
(select e.event_id
from events e
where e.user_id = r.user_id and
e.event_start_time <= request_timestamp
order by (case when request_timestamp between event_start_time and event_end_time then 1 else 2 end),
request_timestamp desc
limit 1
) as event_id
from requests r
) r left join
events e
on e.event_id = r.event_id;