获取数据组的最新条目

时间:2015-01-13 14:31:34

标签: mysql sql sorting greatest-n-per-group

我有一个mySQL数据库来存储自行车的位置信息。对于“最后位置”方法,我想只获得自行车的最后一个条目,但是来自所有自行车。

示例:

ID | ## LAT ## | ## LNG ## | #### TIMESTAMP #### | BIKE_ID
----------------------------------------------------------
16 | N47.68526 | E16.59032 | 2015-01-12 14:49:51 | 3
17 | N47.36345 | E16.12096 | 2015-01-12 14:50:27 | 9
18 | N44.12526 | E15.12562 | 2015-01-12 14:51:45 | 1
19 | N47.87654 | E16.54323 | 2015-01-12 14:51:51 | 3
20 | N47.12345 | E16.12341 | 2015-01-12 14:52:27 | 1
21 | N47.12531 | E15.12561 | 2015-01-12 14:52:45 | 9
22 | N44.12531 | E16.12561 | 2015-01-12 14:53:01 | 1
23 | N47.12531 | E15.12561 | 2015-01-12 14:53:18 | 9
...

我想输出如下:

ID | ## LAT ## | ## LNG ## | #### TIMESTAMP #### | BIKE_ID
----------------------------------------------------------
19 | N47.87654 | E16.54323 | 2015-01-12 14:51:51 | 3
22 | N44.12531 | E16.12561 | 2015-01-12 14:53:01 | 1
23 | N47.12531 | E15.12561 | 2015-01-12 14:53:18 | 9

3 个答案:

答案 0 :(得分:2)

1st获取一组带有每辆自行车最大时间戳的数据,然后根据自行车ID和最大时间戳将其连接回整套。这假设您需要基表中的其他数据。如果你不这样做,单独的内部选择将起作用......

如果您需要表格中的其他数据......

SELECT t.id AS 'ID', 
       t.lat AS '## LAT ##', 
       t.lng AS '## LNG ##', 
       t.timestamp AS '#### TIMESTAMP ####', 
       t.bike_Id AS 'BIKE_ID' 
FROM table_Name t
INNER JOIN (SELECT bike_ID, max(timestamp) mts 
            FROM tableName
            GROUP BY bike_ID) t2 
  on t2.bike_ID = t.bike_ID 
 and t2.mts = t.timestamp

如果不是......只需使用汇总......

SELECT bike_ID, 
       max(timestamp) mts 
FROM tableName
GROUP BY bike_ID

答案 1 :(得分:0)

基本上这个:

SELECT * 
FROM yourtable
INNER JOIN (
   SELECT BIKE_ID, MAX(TIMESTAMP)
   FROM yourtable
   GROUP BY BIKE_ID
) AS foo ON ((yourtable.BIKE_ID = foo.BIKE_ID) AND (yourtable.TIMESTAMP = foo.TIMESTAMP))

子查询获取每个自行车ID的最高时间戳,然后您可以使用该时间戳对原始表进行自联接,以选择与这些ID /时间戳对应的其他字段。

答案 2 :(得分:0)

此问题相当常见,并且具有优雅的优化。如果您的最后一个条目保证是id值最高的那个(也就是说,如果您的id列是自动增量列并且该表正在记录新数据),做到这一点:

 SELECT t.BIKE_ID, t.LAT, t.LNG, t.`TIMESTAMP`
   FROM table t
   JOIN (SELECT MAX(ID) AS ID 
          FROM table
         GROUP BY BIKE_ID
        ) m ON t.ID = m.ID

内部查询(MAX ... GROUP BY)有效地识别每个自行车的最新条目。如果你将复合索引(BIKE_ID, ID)放在你的桌子上,这个查询确实非常有效,因为它可以做到所谓的 loose index scan

专业提示。将纬度和经度设为FLOAT值,其中North和East为正数。