访问SQL:计算每天的最小日期值和持续时间

时间:2013-08-12 18:33:14

标签: sql ms-access

我正在查看车辆的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

我知道这可能很复杂,但我希望开始理解构建块来完成这个。谢谢大家!

1 个答案:

答案 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列表。