2

我有一张桌子trip_data。每一秒钟我都会收到数据包并将数据插入数据库。trip_data表包含四个fields.trip_paramid,fuel_content,creation_time&vehicle_id。我想选择创建时间差为 2 分钟的所有行(不完全是 2。大约 2)。trip_data表包含 40 缺少行。所以我需要一个优化的选择查询。任何人都可以帮助解决这个问题。这里是 trip_table 的表模式和示例数据..

SQLlFiddle 演示

4

3 回答 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) 的日期

这是SQLFiddle 演示

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 回答