我有一个MySQL查询,可以为我的车辆跟踪'in'和'out'时间。
问题是'in'时间与'out'时间不同,因此在两者之间丢失秒或分钟。
有没有办法将'in'时间设置为等于上一行的'out time',即使我需要将当前的select嵌入到新的select中?
您将在下面的图片中看到第一行时间为15:45:14
,下一行的时间为15:46:14
。所以在这种情况下,分钟为lost
实际上,如果车辆已离开一个点,它会立即前往下一个点,因此我可以将in
时间设置为等于前一行的out
时间。这样,时间永远不会是lost
我查询的sql是:
select vehicle,InTime,OutTime from (select
PreQuery.callingname as vehicle,
PreQuery.geofence,
PreQuery.GroupSeq,
MIN( PreQuery.`updatetime` ) as InTime,
UNIX_TIMESTAMP(MIN( PreQuery.`updatetime`))as InSeconds,
MAX( PreQuery.`updatetime` ) as OutTime,
UNIX_TIMESTAMP(MAX( PreQuery.`updatetime`))as OutSeconds,
TIME_FORMAT(SEC_TO_TIME((UNIX_TIMESTAMP(MAX( PreQuery.`updatetime` )) - UNIX_TIMESTAMP(MIN( PreQuery.`updatetime`)))),'%H:%i:%s') as Duration,
(UNIX_TIMESTAMP(MAX( PreQuery.`updatetime` )) - UNIX_TIMESTAMP(MIN( PreQuery.`updatetime`))) as DurationSeconds
from
( select
v_starting.callingname,
v_starting.geofence,
v_starting.`updatetime`,
@lastGroup := @lastGroup + if( @lastAddress = v_starting.geofence
AND @lastVehicle = v_starting.callingname, 0, 1 ) as GroupSeq,
@lastVehicle := v_starting.callingname as justVarVehicleChange,
@lastAddress := v_starting.geofence as justVarAddressChange
from
v_starting,
( select @lastVehicle := '',
@lastAddress := '',
@lastGroup := 0 ) SQLVars
order by
v_starting.`updatetime` ) PreQuery
Group By
PreQuery.callingname,
PreQuery.geofence,
PreQuery.GroupSeq) parent
where (InTime> DATE_SUB('2013-03-23 15:00', INTERVAL 24 HOUR) or OutTime> '2013-03-23 15:00' ) and vehicle='TT08' order by InTime asc
MySQL语法的深度非常大,但也可以在更简单的查询上完成。喜欢
select vehicle, intime,outtime from vehicletimes
我想要的结果是:
select vehicle, intime(outtime of row above),outtime from vehicletimes
时间的第一行可以是原样,最后一行的时间可以是原样。我只需要考虑最小时间和最长时间之间的每一秒。
任何帮助一如既往的赞赏。
提前致谢
答案 0 :(得分:1)
我认为这将为您提供每个当前时间之前的最新时间,为您的现有记录:
select
vt.vehicle, max(qGetMaxOut.outtime) as intime , vt.outtime
from
vehicle_times vt
inner join
(
select vehicle, outtime
from vehicle_times
) qGetMaxOut
on qGetMaxOut.vehicle = vt.vehicle
and qGetMaxOut.outtime <= vt.intime
group by
vt.vehicle, vt.outtime
如果您想插入新记录,上述查询也会有所帮助,但需要找到特定时间的先前及时(即如果您需要插入新记录的人)输入/输出时间之前到最新时间 - 例如,插入之前错过的记录以及之后添加了更新的时间条目)。如果你需要这个场景,请告诉我,如果你不能从上面解决这个问题,我会详细说明。
连接基本上将表“加回”以提供另一个“副本”,但是将“复制”中的结果限制为仅主表中当前车辆的那些行,并从副本中排除这些行车辆的停机时间比主表的当前时间更近。通过这种方式,您可以在副本上执行MAX(),以查找之前的时间。
我不知道您的具体要求,但我建议您存储最准确的信息。因此,如果在一些报告中“合成”一个值只是为了美化目的,我会单独留下数据并整理报告,而不是丢失可能在赛道上派上用场的数据。例如,如果将来你突然有一个要求告诉你的老板“我们的车辆在'并且闲置的时间有多长时间?'”会发生什么?
但是,如果你只想插入一条新记录,忽略实际的时间,并用最近的时间替换记录,然后以下查询将为您找到该值:
select
vt.vehicle, max(vt.outtime) as intime
from
vehicle_times vt
group by
vt.vehicle
我是否错过了您的要求?