2013-03-25 178 views
1

我有一個MySQL查詢,爲我的車輛跟蹤'in'和'out'時間生成一個表格。mysql - 設置單元格的值等於另一行單元格的值

問題在於'進入'時間與'出'時間不一樣,所以秒或分鐘之間會丟失。

是否有一種方法可以將'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 

第一排的時間可能是最後行outtime可以原樣。我只需要在最短的時間和最長的時間之間考慮每一秒。

任何幫助一如既往的讚賞。

在此先感謝

+0

1.你不想跟蹤車輛進入的時間嗎? 2.您是否要求SQL「報告」外部時間與以前的銀泰時間相同,或者您想要「更正」現有行還是SQL來插入新行? – Sepster 2013-03-25 09:12:37

+0

車輛的運動是連續的。所以它將它記錄爲特定的地理圍欄或路線。問題在於車輛每分鐘都會發送一次更新,所以新車的準確時間不得而知。爲了我所做的這個項目,把時間設置到最後的時間就足夠了。 – Smudger 2013-03-25 09:30:29

+0

我已經創建了一個小提琴來玩,簡化了MySQL的例子,但同樣的概念。 http://sqlfiddle.com/#!2/cbf36/1 – Smudger 2013-03-25 09:31:05

回答

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(),以查找以前的停用時間。

我不知道你的具體要求,但我會建議存儲最準確的信息,你可以。因此,如果在一些報告中將某個值「sythensising」僅用於美觀目的,那麼我將單獨留下數據,並整理報告,而不是丟失可能在該賽道上輕鬆投入的數據。例如,如果將來發生什麼情況,你突然有要求告訴你的老闆「我們的車輛有多長時間」,並坐着閒置?

但是,如果你只是想插入實際的新紀錄了時間忽略不計,並通過及時從最近記錄,那麼這下面的查詢會發現價值取代對你來說:

select 
vt.vehicle, max(vt.outtime) as intime 

from 
vehicle_times vt 

group by 
vt.vehicle 

我錯過了你的要求嗎?

+0

謝謝Sepster,真的很感激這個輸入。爲了澄清,我只是創建一個'時間表'報告,以顯示車輛在什麼時間大約在什麼時間。因此我需要一切時間來考慮。如果需要,我仍然會有真實的準確數據。我只是輸出查詢到一個PHP數組,並從那裏玩它。 – Smudger 2013-03-25 09:33:55

+0

再次感謝,真棒知識。我已經在小提琴中嘗試了這一點,而不是100%正確。如果你有一分鐘​​,將不勝感激。 http://sqlfiddle.com/#!2/cbf36/7 – Smudger 2013-03-25 09:39:49

+0

@Smudger在這裏,你去交配,對此有一個破解。 – Sepster 2013-03-25 09:50:48

相關問題