【问题标题】:Access SQL: Calculating Min date value and duration for each dayAccess SQL:计算每天的最小日期值和持续时间
【发布时间】:2013-08-14 04:28:57
【问题描述】:

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

我正在尝试找到第一个点火关闭点,其中地标不为空,最后点火打开 每天的地标不为空的点。理想情况下,可以包含“持续时间”的计算字段以显示这两个值之间的 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

我知道这可能很复杂,但我希望开始了解完成此任务的构建模块。谢谢大家!

【问题讨论】:

  • sqlteam.com/forums/topic.asp?TOPIC_ID=111383 我不知道这是不是您要找的东西,但看起来他们在一个查询中就找到了它
  • @Mr.Monshaw 这是一个 SQL 服务器实现。 Access 不支持 row_number 分区功能。 OP,我建议从谷歌搜索“Access row_number”或“Access windowing / partitioning function”实现开始

标签: sql ms-access


【解决方案1】:

您的 GPS 数据表中必须有一个唯一的主键。我认为没有一个人就无法解决这个问题。

如果您还没有,只需将名为 IDAutoNumber 字段添加到您的 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 ALL 这两个列表为我们获取与每辆车的第一个每日“关闭”和最后一个每日“开启”匹配的所有记录的 ID(我们称之为 ResultID)。

  • 用原来的GPSData重新加入这个记录ID列表。

【讨论】:

    猜你喜欢
    • 2021-08-05
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    相关资源
    最近更新 更多