2012-03-12 10 views
-1

以下のスクリーンショットのデータを含むmysqlテーブルがあります。mysqlを使用して、顧客の車両の出入り時間、複数の停留所、各顧客の入力を処理します。

私の要件は、各顧客の入退室時間を表示するmysqlクエリを生成することです。 私が持っている問題は、車両が同じ顧客をある期間内に2〜3回訪れた可能性があるため、最小値または最大値を使用できないということです。

は、だから私は探しています出力は、次のとおりです。

Vehicle: RB10 
Customer: Hulamin 
In: 10:19 
out: 10:35 
Time Taken: 16 min 
In: 11:14 
out: 11:29 
Time Taken: 15 min 
ave time taken: 15.5 min 

し、必要に応じて他のサイトと各車両に同じ。

対応する出力時間とレポートの前に最小時間を取るようにmysqlに指示するにはどうすればよいですか?

多くのお手伝いをしていただきありがとうございます。

+0

おそらくあなたはこの質問をhttp://www.doAllMyWorkForMe.comで聞いてください。 – Bohemian

答えて

1

複数回発生した場合でも、アドレスが変更されたときの制御を支援するために、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」で終わるようです。これが間違った前提である場合は、明らかに変更を加える必要があります。

+0

ありがとうDrapp、本当に本当に本当にこの答えに入れていただきありがとうございます。私はそれを消化してそれから学ぶためにある程度の時間が必要です。もう一度多くのお礼をいただき、どこから始めたらいいかわかりませんでした。 – Smudger

+1

@変数をインラインプログラムと考えてください。 :=は代入であり、結果はその行の最終列に格納されますが、次のサイクルのためにその値が保持されます。したがって、順序の値のループのように、行ごとに刻印されます。すべての値を表示するには、外側の前に内側のクエリを単独で実行します。次に、外部クエリに適用して最終結果を確認します。 – DRapp

+0

DRappにもう一度感謝します。あなたの時間を感謝します。これは間違いなく練習するでしょう。乾杯、 – Smudger

関連する問題