3

次の情報で構成される車両の GPS データを見ています。

vehicle        day              ignition   landmark
---------------------------------------------------
Sample Guy 1   7/5/2013 14:32   on         
Sample Guy 1   7/5/2013 15:10   off        Random Place B
Sample Guy 1   7/5/2013 15:15   on         Random Place B
Sample Guy 1   7/5/2013 15:20   off
Sample Guy 1   7/20/2013 18:14  on
Sample Guy 1   7/20/2013 18:20  off        Random Place H
Sample Guy 1   7/20/2013 18:22  on         Random Place H
Sample Guy 1   7/20/2013 18:24  off
Sample Guy 2   8/1/2013 12:10   on         Random Place ZZ
Sample Guy 2   8/1/2013 12:12   on         
Sample Guy 2   8/1/2013 12:15   off        Random Place ZY
Sample Guy 2   8/1/2013 13:10   on         Random Place ZY
Sample Guy 2   8/1/2013 13:15   off

ランドマークが Not Null である最初のイグニッションオフポイントと、ランドマークが Not Null である最後のイグニッションオンポイントを毎日見つけようとしています。理想的には、「期間」の計算フィールドを含めて、これら 2 つの値の間の DateDiff を表示できます。

ターゲット出力:

    vehicle        day          ignition   landmark  
---------------------------------------------------------
Sample Guy 1   7/5/2013 15:10   off        Random Place B
Sample Guy 1   7/5/2013 15:15   on         Random Place B
Sample Guy 1   7/20/2013 18:20  off        Random Place H
Sample Guy 1   7/20/2013 18:22  on         Random Place H
Sample Guy 2   8/1/2013 12:15   off        Random Place ZY
Sample Guy 2   8/1/2013 13:10   on         Random Place ZY

これは複雑かもしれませんが、これを完了するための構成要素を理解し始めたいと考えています。みんな、ありがとう!

4

1 に答える 1

1

GPS データ テーブルに最初に含める必要があるのは、一意の主キーです。これなしではこの問題を解決できないと思います。

まだ持っていない場合は、テーブルにAutoNumber呼び出されたフィールドを追加するだけですIDGPSData

これを実行すると、Access で機能するクエリを次に示します。

SELECT R.ResultID,
       vehicle,
       day,
       ignition,
       landmark
FROM   (SELECT First(ID) AS ResultID
        FROM   (SELECT ID,
                       vehicle,
                       DateSerial(day([day]), month([day]), year([day])) AS NormalisedDate,
                       ignition
                FROM   GPSData
                WHERE  ((ignition = "off") AND (landmark IS NOT NULL))
                ORDER  BY day ASC)
        GROUP  BY vehicle, normalisedDate, ignition
        UNION ALL
        SELECT Last(ID) AS ResultID
        FROM   (SELECT ID,
                       vehicle,
                       DateSerial(day([day]), month([day]), year([day])) AS NormalisedDate,
                       ignition
                FROM   GPSData
                WHERE  ((ignition = "on") AND (landmark IS NOT NULL))
                ORDER  BY day ASC)
        GROUP  BY vehicle, NormalisedDate, ignition) AS R
       INNER JOIN GPSData
         ON R.ResultID = GPSData.ID
ORDER  BY vehicle, day 

これを行うためのより良い方法があるかもしれませんが、賢くしようとしているわけではありませんが、これは機能するはずです。

基本的に、問題を小さなチャンクに分割してから再構築します。

  • 最初に「オフ」になったすべての車両のすべての日次記録の ID を見つけます。
    このリストを見つけるには、データを日ごとにグループ化する必要があるため、datetimedayをその日付部分のみに正規化する必要があります。

  • まったく同じことを行いますが、毎日の最後の「オン」レコードに対してです。

  • UNION ALLResultIDこれら 2 つのリストを使用して、各車両の最初の毎日の「オフ」と最後の毎日の「オン」の両方に一致するすべてのレコードの ID ( と呼びましょう) を取得します。

  • このレコード ID のリストを元の と再結合しGPSDataます。

于 2013-08-13T02:54:04.817 に答える