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:

  1. 如果请求是在事件处于活动状态时发出的,我们应该选择它,即 request_timestamp >= events.start_time AND request_timestamp <= events.end_time。然后完成

  2. 如果没有活动事件,我们需要选择在请求之前结束的事件,即找到与用户关联的所有事件并过滤掉 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;