在 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 中加入“时间相似性”的主要内容,如果未能解决你的问题,请参考以下文章

时间序列数据挖掘综述

MySQL查询日期在结果中加入汉字“年”“月”“日”

MySQL查询日期在结果中加入汉字“年”“月”“日”

在 MySQL 中加入 CASE

在 MySql 中加入和求和?

在 MySQL 中加入表的转置