複数回発生した場合でも、アドレスが変更されたときの制御を支援するために、SQL変数を使用して実行できます。 MySQLをすぐに利用できなければ、私は以下のようなアプローチになります。車両や住所の変更に基づいて「GroupSeq」をスタンプする内部クエリから始めます。注文は日付/時刻順に保存してください。 @lastGroupに対する各テストが終了した後、またはシーケンスに1を加えた後、比較のために選択されたNEXTレコードの基礎として@lastAddressおよび@lastVehicleを更新します。あなたの例当たり
は、各顧客の結果は、(すべてのこれらの同じ車両ので、その列の重複しないディスプレイ) アドレスGROUPSEQ Hulamin 1枚の SACD 2 UL 3 NP 4 Hulamin 5 SACD 6あろう
その後、割り当てられたGroupSeqに基づいてMIN/MAXを正しく実行することができます。
select
PreQuery.Vehicle,
PreQuery.Address,
PreQuery.GroupSeq,
MIN(PreQuery.`DateTime`) as InTime,
MAX(PreQuery.`DateTime`) as OutTime
from
(select
YT.Vehicle,
YT.Address,
YT.`DateTime`,
YT.Direction,
@lastGroup := @lastGroup + if(@lastAddress = YT.Address
AND @lastVehicle = YT.Vehicle, 0, 1) as GroupSeq,
@lastVehicle := YT.Vehicle as justVarVehicleChange,
@lastAddress := YT.Address as justVarAddressChange
from
YourTable YT,
(select @lastVehicle := '',
@lastAddress := '',
@lastGroup := 0) SQLVars
order by
YT.`DateTime`) PreQuery
Group By
PreQuery.Vehicle,
PreQuery.Address,
PreQuery.GroupSeq
上記今
Vehicle Address GroupSeq InTime OutTime
RB10 Hulamin 1 10:19 10:35
RB10 SACD 2 10:37 10:40
RB10 UL 3 10:41 11:06
RB10 NP 4 11:07 11:14
RB10 Hulamin 5 11:14 11:28
RB10 SACD 6 11:29 12:21
のようなものになるべきで、上記のサンプルは、実際にアウトごとにかかった合計時間を計算せず、また何のため車両/顧客の平均時間あたりの平均処理されているように見えますが、この部分を理解して取得した後で、それらの計算を追加できます。
日時によって表示される自然順序に基づいています。最初から最後までの1つのトランザクションは多くの「IN」を持つことができますが、常に次のカスタマーアドレスに進む前に「OUT」で終わるようです。これが間違った前提である場合は、明らかに変更を加える必要があります。
おそらくあなたはこの質問をhttp://www.doAllMyWorkForMe.comで聞いてください。 – Bohemian