我有一张桌子trip_data
。每一秒钟我都会收到数据包并将数据插入数据库。trip_data
表包含四个fields.trip_paramid,fuel_content,creation_time&vehicle_id
。我想选择创建时间差为 2 分钟的所有行(不完全是 2。大约 2)。trip_data
表包含 40 缺少行。所以我需要一个优化的选择查询。任何人都可以帮助解决这个问题。这里是 trip_table 的表模式和示例数据..
问问题
159 次
3 回答
1
SELECT
tp.*
FROM
trip_parameters tp
GROUP BY
CONVERT(UNIX_TIMESTAMP (tp.creation_time)/(2*60), unsigned)
ORDER BY
tp.creation_time asc
请注意,使用 UNIX_TIMESTAMP 不允许您处理 2037 年之后的日期。使用以下代替可以解决问题:
CONVERT(TIMESTAMPDIFF(SECOND,'1970-01-01 00:00:00',tp.creation_time)/(2*60), unsigned)
于 2012-11-30T07:13:03.547 回答
0
您可以使用MYSQL 用户定义变量在一次表扫描中完成。不幸的是,UDV 的数据类型有限(整数、十进制、浮点、二进制或非二进制字符串)。因此,在此查询中,我使用 char@ti
变量存储以前的日期时间,使用 CAST 将其与Creation_time
字段进行比较。这个变量的初始值我设置为 (now()-10000000) 你可以使用任何你希望小于 MIN(Creation_time) 的日期
select * from
(
select trip_parameters.*,
if(ABS(TIMESTAMPDIFF(MINUTE,Creation_time,cast(@ti as datetime)))>=2,1,0) t,
@ti:=if(ABS(TIMESTAMPDIFF(MINUTE,Creation_time,cast(@ti as datetime)))>=2,
cast(Creation_time as char(100)),@ti)
from trip_parameters,
(select @ti:=cast(now()-10000000 as char(100))) a
order by creation_time
) t2
where T=1
order by creation_time
于 2012-11-30T07:47:26.580 回答
-1
试试这个
SELECT trip_paramid, fuel_content, creation_time, vehicle_id
FROM trip_parameters
GROUP BY FLOOR(UNIX_TIMESTAMP(creation_time)/120)
这需要每 2 分钟块中的一项
于 2012-11-30T07:12:51.127 回答