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的最后一个点火。理想情况下,可以包含“持续时间”的计算字段以显示这两个值之间的 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名为的字段添加ID到您的GPSData表中

完成此操作后,以下查询将在 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。
    要找到这个列表,我们必须按天对数据进行分组,因此我们必须将日期时间规范化day为其日期部分。

  • 做完全相同的事情,但每天的最后一个“on”记录。

  • UNION ALLResultID这两个列表为我们提供了与每辆车的第一个每日“关闭”和最后一个每日“开启”相匹配的所有记录的 ID(我们称之为)。

  • 用原始的 .re-JOIN 这个记录 ID 列表重新加入GPSData

于 2013-08-13T02:54:04.817 回答