mysql - 设置单元格的值等于另一行中单元格的值

时间:2013-03-25 09:02:51

标签: mysql sql

我有一个MySQL查询,可以为我的车辆跟踪'in'和'out'时间。

问题是'in'时间与'out'时间不同,因此在两者之间丢失秒或分钟。

有没有办法将'in'时间设置为等于上一行的'out time',即使我需要将当前的select嵌入到新的select中?

您将在下面的图片中看到第一行时间为15:45:14,下一行的时间为15:46:14。所以在这种情况下,分钟为lost

实际上,如果车辆已离开一个点,它会立即前往下一个点,因此我可以将in时间设置为等于前一行的out时间。这样,时间永远不会是lost

enter image description here

我查询的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

时间的第一行可以是原样,最后一行的时间可以是原样。我只需要考虑最小时间和最长时间之间的每一秒。

任何帮助一如既往的赞赏。

提前致谢

1 个答案:

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

我是否错过了您的要求?