代码之家  ›  专栏  ›  技术社区  ›  Smudger

mysql-将单元格的值设置为另一行中单元格的值

  •  1
  • Smudger  · 技术社区  · 13 年前

    我有一个MySQL查询,它为我的车辆跟踪“进入”和“离开”时间生成一个表。

    问题是“输入”时间与“输出”时间不同,因此在两者之间会损失几秒或几分钟。

    有没有办法将“输入”时间设置为前一行的“输出”时间,即使我需要将当前选择嵌入到新选择中?

    你会在下面的图片上看到,第一行的超时时间是 15:45:14 下一行的时间是 15:46:14 .所以在这种情况下,一分钟是 lost

    事实上,如果车辆离开了一个点,它会立即在通往下一个点的路上,所以我可以设置 in 时间等于 out 上一行的时间。这样,时间就永远不会 迷路的

    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 回复  |  直到 13 年前
        1
  •  1
  •   Sepster    13 年前

    我想这会在之前给你最新的时间 每个 当前外出时间,对于您的现有记录:

    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()操作,以查找以前的超时时间。

    我不知道你的具体要求,但我建议你储存 你能得到的最准确的信息 。因此,如果“sythensing”一个值只是为了在一些报告中进行修饰,我会把数据放在一边,整理报告,而不是丢失可能有用的数据。例如,如果将来你突然要求告诉老板“我们的车‘停’了多久,闲置了多久?”

    但如果你真的只是想 插入 与 真实的 忽略out时间,并由中的in时间替换 最近的 记录,则以下查询将为您找到该值:

    select
     vt.vehicle, max(vt.outtime) as intime
    
    from 
     vehicle_times vt
    
    group by 
     vt.vehicle
    

    我错过你的要求了吗?