首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按最近时间合并两个表的SQL

按最近时间合并两个表的SQL
EN

Stack Overflow用户
提问于 2015-05-28 19:09:06
回答 1查看 293关注 0票数 0

我有一个全球定位系统的位置和时间信息(时间,拉特,长)。我有一个表事件,它保存特定类型事件(时间)的时间。

我需要sql (最好是mysql)来创建一个新的表:events_with_gps,对于表事件中的每个记录,注册表gps寄存器的位置(lat,long),该寄存器在事件发生时更接近。

示例:

代码语言:javascript
复制
gps:
11:00:00, 10, 10
11:05:00, 14, 14
11:10:00, 18, 18
11:15:00, 20, 20
11:20:00, 22, 22

events:
11:06:02
11:14:09

events_with_gps:
11:06:02, 14, 14
11:14:09, 20, 20

另外,是否可以将events_with_gps中的位置设置为上一次和下一次全球定位系统寄存器之间的平均位置?

代码语言:javascript
复制
events_with_gps_avg:
11:06:02, 16, 16
11:14:09, 19, 19
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-28 20:50:46

在最近时间执行连接的一种方法是首先使用CROSS JOIN来计算gps表和event表中的时间列之间的所有可能的差异。

以下查询:

代码语言:javascript
复制
SELECT e.`time` AS etime, g.`time` AS gtime, g.lat, g.`long`, 
       ABS(TIMEDIFF(e.`time`, g.`time`)) AS diff
FROM events AS e
CROSS JOIN gps AS g
ORDER BY e.`time`, diff

产生以下输出:

代码语言:javascript
复制
etime       gtime       lat long    diff
------------------------------------------
11:06:02    11:05:00    14  14      102
11:06:02    11:10:00    18  18      358
11:06:02    11:00:00    10  10      602
11:06:02    11:15:00    20  20      858
11:06:02    11:20:00    22  22      1358
11:14:09    11:15:00    20  20      51
11:14:09    11:10:00    18  18      409
11:14:09    11:20:00    22  22      551
11:14:09    11:05:00    14  14      909
11:14:09    11:00:00    10  10      1409

如果您使用GROUP BY etime并使用GROUP_CONCAT,您可以从上面的结果集中选择具有最小diff值的记录。您可以将JOIN这些记录返回到gps以获取要插入到events_with_gps中的记录

代码语言:javascript
复制
SELECT t.`time`, g.lat, g.`long`
FROM (
SELECT e.`time`, 
       SUBSTRING_INDEX(
          GROUP_CONCAT(g.`time` 
                       ORDER BY ABS(TIMEDIFF(e.`time`, g.`time`))), ',', 1) AS matchedTime
FROM events AS e
CROSS JOIN gps AS g
GROUP BY e.`time` ) t
INNER JOIN gps AS g ON CAST(t.matchedTime AS TIME) = g.`time` 

输出:

代码语言:javascript
复制
 time       lat long
-----------------------
'11:06:02'  14  14
'11:14:09'  20  20

Demo here

要获得第二个结果集,可以使用以下查询获取每个events记录的前一个和下一个events记录:

代码语言:javascript
复制
SELECT e.`time` as etime, 
       (SELECT `time`
        FROM gps AS g
        WHERE g.`time` <= e.`time`
        ORDER BY g.`time` DESC 
        LIMIT 1) AS prevTime,
       (SELECT `time`
        FROM gps AS g
        WHERE g.`time` > e.`time`
        ORDER BY g.`time`  
        LIMIT 1) AS nextTime        
FROM events AS e

输出:

代码语言:javascript
复制
etime     prevTime  nextTime
------------------------------
11:06:02  11:05:00  11:10:00
11:14:09  11:10:00  11:15:00

现在,您可以将上面的表用作派生表,以便连接到gps并获取“以前”和“下一步”latlong值:

代码语言:javascript
复制
SELECT t.etime, (g1.lat + g2.lat) /2 , (g1.`long` + g2.`long`) / 2
FROM (
SELECT e.`time` as etime, 
       (SELECT `time`
        FROM gps AS g
        WHERE g.`time` <= e.`time`
        ORDER BY g.`time` DESC 
        LIMIT 1) AS prevTime,
       (SELECT `time`
        FROM gps AS g
        WHERE g.`time` > e.`time`
        ORDER BY g.`time`  
        LIMIT 1) AS nextTime        
FROM events AS e ) t
INNER JOIN gps AS g1 ON t.prevTime = g1.time
INNER JOIN gps AS g2 ON t.nextTime = g2.time

输出:

代码语言:javascript
复制
 time       lat long
-----------------------
'11:06:02'  16  16
'11:14:09'  19  19

Demo here

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30515172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档