在 MySQL 中加入“时间相似性”
Posted
技术标签:
【中文标题】在 MySQL 中加入“时间相似性”【英文标题】:Do a 'time similarity' join in MySQL 【发布时间】:2013-09-10 18:37:25 【问题描述】:我想知道是否可以使用单个选择连接查询来实现以下目标。
假设我们有两个表(两个表的行都指的是一些及时发生的事件)。 第一个,TableA 有以下列:
ID,TimeOfOccurrence,SomeData1
第二个,TableB,看起来很相似:
ID,TimeOfOccurrence,SomeData2
TableA和TableB中的事件发生的时间总是不同的,因为它们是独立发生的。
我从 TableA 中选择事件,例如使用以下查询:
SELECT * FROM TableA WHERE SomeData1 LIKE 'something'
现在我想通过以下方式加入 TableB: 对于此结果集中的每个事件,我想添加来自 TableB 的事件的 ID 和 SomeData2,这些事件发生在最近的事件中,假设在 10 分钟间隔内,相对于结果集中的特定行。换句话说,我是根据 TableA 和 TableB 中事件的时间相邻性进行连接的。
有什么办法吗?
【问题讨论】:
见dev.mysql.com/doc/refman/5.6/en/… 是的,我知道 TIMEDIFF(),但关键是如何构造连接查询,因此连接的列包含第二个表中时间最接近的值。 【参考方案1】:试试这个方法:
select *
from A
join B
on A.somedata1
between
B.somedata2 - interval 10 minute
and
B.somedata2 + interval 10 minute
演示 --> http://www.sqlfiddle.com/#!2/d7ed9/1
----------- 编辑 --------------- 这是一个演示,其中包含如何选择最接近匹配的示例 ---> http://www.sqlfiddle.com/#!2/4b86b/12
SELECT id1, somedata1, id2, somedata2
FROM (
select id1, somedata1,
min( abs( time_to_sec( somedata1 ) -
- time_to_sec( somedata2 ))) d_min
from A
join B
on A.somedata1
between
B.somedata2 - interval 10 minute
and
B.somedata2 + interval 10 minute
GROUP BY id1
) xx
JOIN B
ON xx.somedata1
between
B.somedata2 - interval 10 minute
and
B.somedata2 + interval 10 minute
AND abs( time_to_sec( somedata1 ) -
- time_to_sec( somedata2 ))
<= d_min
【讨论】:
感谢您的回答。但是我有一个问题 - 如果在该间隔内 somedata2 有多个匹配项,我如何确定选择了最接近的一个? 我需要确保在加入后只选择最接近的一个。原因是如果没有匹配,我想增加间隔,然后很容易发生突然的多个匹配。 你的意思是使用TimeOfOccurrence - interval...
而不是SomeData... - interval...
,不是吗。以上是关于在 MySQL 中加入“时间相似性”的主要内容,如果未能解决你的问题,请参考以下文章