获取数据组的最新条目

Posted

技术标签:

【中文标题】获取数据组的最新条目【英文标题】:Get latest entry of group of data 【发布时间】:2015-01-13 14:31:33 【问题描述】:

我有一个 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

【问题讨论】:

检查this answer、this one、this one和this one。 我敢打赌这是MySQL SO 上问得最多的问题。 Retrieving the last record in each group的可能重复 @axiac:它非常受欢迎,甚至有自己的标签 【参考方案1】:

首先获取一组数据,其中包含每辆自行车的最大时间戳,然后根据自行车 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

【讨论】:

【参考方案2】:

基本上是这样的:

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/时间戳对应的其他字段。

【讨论】:

【参考方案3】:

这个问题相当普遍,并且有一个优雅的优化。如果您的最后一个条目保证是具有最高值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 是正数。

【讨论】:

以上是关于获取数据组的最新条目的主要内容,如果未能解决你的问题,请参考以下文章

如何从 HealthKit 数据中获取最新的体重条目

从数据库中获取最新条目

SQLSERVER 查询分组后获取每组的最新一条数据

获取每组的前 1 行

获取每组的前 1 行

Doctrine Query Language 获取每组的最大/最新行