我正在查看车辆的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
我正在尝试找到第一个点火关闭点,其中地标是非空的,最后点火 on < / em> 每天的地标不是空的点。理想情况下,可以包含“持续时间”的计算字段,以显示这两个值之间的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
我知道这可能很复杂,但我希望开始理解构建块来完成这个。谢谢大家!
答案 0 :(得分:1)
您在GPS数据表中必须拥有的第一件事是一个独特的主键。我不认为没有人就能解决这个问题。
如果您还没有,只需在您的AutoNumber
表中添加一个名为ID
的{{1}}字段
这是一个在Access完成后将在Access中运行的查询:
GPSData
可能有更好的方法可以做到这一点,但这应该有效,即使它不是想要聪明。
基本上,我们将问题分成较小的块然后重新构建:
查找首次“关闭”的所有车辆的所有日常记录的ID
要查找此列表,我们必须按天对数据进行分组,因此我们必须将日期时间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
规范化为其日期部分。
做同样的事情,但是对于每天的最后一次“开启”记录。
day
这2个列表可以获取所有记录的ID(我们称之为UNION ALL
),这些记录与每辆车的第一个每日“关闭”和每天的“每天”开启相匹配
使用原始ResultID
重新加入此记录ID列表。