【问题标题】:Joining tables based on closest times根据最近时间连接表
【发布时间】:2021-03-09 20:52:31
【问题描述】:

我想根据其他时间戳连接两个表

表 A:

username | activity | timestamp
A          activity1  2020-01-01 01:00:00
A          activity2  2020-01-01 02:00:00
A          activity3  2020-01-01 03:00:00
B          activity1  2020-01-01 02:00:00
B          activity2  2020-01-01 03:00:00
B          activity3  2020-01-01 04:00:00

表 B:

username | clickId | timestamp
A          click1  2020-01-01 00:00:00
A          click2  2020-01-01 01:30:00
A          click3  2020-01-01 01:45:00
B          click1  2020-01-01 00:00:00
B          click2  2020-01-01 00:30:00
B          click3  2020-01-01 03:35:00

需要将活动表中的所有活动与每个用户执行的点击表中的最近点击匹配

与每个活动匹配的点击必须是在活动时间戳之前发生的最近一次点击

输出:

A activity1 click1 - since for activity1 click1 is the timestamp smaller than it
A activity2 click3
A activity3 click3
B activity1 click2
B activity2 click2
B activity3 click3

我尝试了多个查询但没有成功

【问题讨论】:

  • 您使用的是 MySQL 还是 MS SQL Server?我认为他们的日期/时间函数不兼容。
  • 什么是精确 MySQL 版本?每个username 系列的平均行数是多少?

标签: mysql sql


【解决方案1】:

一种方法是相关子查询:

select a.*,
       (select b.clickid
        from b
        where b.username = a.username and
              b.timestamp <= a.timestamp
        order by b.timestamp desc
        limit 1
       ) as clickid
from a;

您也可以使用窗口函数来做到这一点:

select a.*, b.*
from a left join
     (select b.*,
             lead(timestamp) over (partition by username) as next_timestamp
      from b
     ) b
     on b.username = a.username and
        a.timestamp >= b.timestamp and
        (a.timestamp < b.next_timestamp or b.next_timestamp is null);

如果您想要多列,这很方便。

【讨论】:

  • @gandalf 。 . .如果这解决了您的问题,您可以接受答案。
【解决方案2】:

试试下面 -

选择 a.username、a.activity、b.clickID 从表 A 内连接表 B b 关于 a.username=b.username 和 a.timestamp > b.timestamp 限定 row_number() over(partition by a.username,a.activity order by b.timestamp desc)=1

【讨论】:

  • 这会在mysql中运行吗?我认为他们没有行号
  • @gandalf 。 . . MySQL 多年来一直支持row_number()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
相关资源
最近更新 更多