获取数据组的最新条目
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 是正数。
【讨论】:
以上是关于获取数据组的最新条目的主要内容,如果未能解决你的问题,请参考以下文章