我在MySQL数据库中有以下表格:
Table temperature
id - sensor_id - value - created_at
1 1 4.5 04-11-2014
2 1 2.2 05-11-2014
3 1 3.3 06-11-2014
4 2 4.5 04-11-2014
5 2 2.2 05-11-2014
6 2 3.3 06-11-2014
我想要做的是获取每个sensor_id的最新N行数据。
我找到了许多不同的解决方案,但大多数都包括非常低效的连接,在我这种情况下不适用,因为我有超过一百万行的数据,查询非常缓慢。
我能想到的最有效的查询是这个:
set @num := 0, @sensor_id:= '';
select id, sensor_id, value, created_at,
@num := if(@sensor_id = sensor_id, @num + 1, 1) as row_number,
@sensor_id := sensor_id as dummy
from temperature
group by id, sensor_id, value, created_at
having row_number <= 2;
这个查询来源于这篇文章:http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/,但问题是它获取的是前N行,而不是最近的N行。如何添加ORDER BY语句才能获取最新的N行而不是前N行?如果你要查询最新的两行数据,期望的结果应该是这样的:
id - sensor_id - value - created_at
2 1 2.2 05-11-2014
3 1 3.3 06-11-2014
5 2 2.2 05-11-2014
6 2 3.3 06-11-2014