【问题标题】:MS Access query difference between current and previous recordMS Access 查询当前记录和以前记录之间的差异
【发布时间】:2016-09-12 12:16:20
【问题描述】:

我在 MS Access 2010 中有一个表格,其中包含以下示例数据:

schedule_nr | part_number | name | date1         | date2         | difference|
------------|-------------|------|---------------|---------------|-----------|
12345       |     1       |Part1 |01-02-16 2:50  |01-02-16 2:50  |           |
12345       |     2       |Part2 |01-02-16 2:54  |01-02-16 2:54  |           |
12345       |     3       |Part3 |01-02-16 3:03  |01-02-16 3:03  |           |
45678       |     1       |Part1 |02-02-16 2:15  |02-02-16 2:15  |           |
45678       |     2       |Part2 |02-02-16 2:19  |02-02-16 2:19  |           |
45678       |     3       |Part3 |02-02-16 2:27  |02-02-16 2:27  |           |
23456       |     1       |Part1 |02-02-16 13:17 |02-02-16 13:17 |           |
23456       |     2       |Part2 |02-02-16 13:21 |02-02-16 13:21 |           |
23456       |     3       |Part3 |02-02-16 13:30 |02-02-16 13:30 |           |
------------|-------------|------|---------------|---------------|-----------|

在“差异”列中,我需要 date2 和 date1 与前一行有所不同。从每个 part_number = 1 计数差异应该从头开始。所以决赛桌应该如下所示:

schedule_nr | part_number | name | date1         | date2         | difference|
------------|-------------|------|---------------|---------------|-----------|
12345       |     1       |Part1 |01-02-16 2:50  |01-02-16 2:50  |0:00:00    |
12345       |     2       |Part2 |01-02-16 2:54  |01-02-16 2:54  |0:04:00    |
12345       |     3       |Part3 |01-02-16 3:03  |01-02-16 3:03  |0:09:00    |
45678       |     1       |Part1 |02-02-16 2:15  |02-02-16 2:15  |0:00:00    |
45678       |     2       |Part2 |02-02-16 2:19  |02-02-16 2:19  |0:04:00    |
45678       |     3       |Part3 |02-02-16 2:27  |02-02-16 2:27  |0:08:00    |
23456       |     1       |Part1 |02-02-16 13:17 |02-02-16 13:17 |0:00:00    |
23456       |     2       |Part2 |02-02-16 13:21 |02-02-16 13:21 |0:04:00    |
23456       |     3       |Part3 |02-02-16 13:30 |02-02-16 13:30 |0:09:00    |
------------|-------------|------|---------------|---------------|-----------|

是否可以在 MS Access 中作为一个查询来完成?

感谢大家的帮助和提示。看起来它现在可以工作了。再次感谢。

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    此查询将给出您所追求的结果 - 加入 schedule_nr 和下一个 part_number。
    如果 T2 返回 NULL,则它是系列中的第一个数字,因此请使用 NZ 将其与 T1 的日期交换,这将返回 0。

    SELECT       T1.schedule_nr
                ,T1.part_number
                ,T1.sname
                ,T1.date1
                ,T1.date2
               , CDATE(NZ(T2.date2,T1.date1) - T1.date1) AS Difference
    FROM        Table2 T1 LEFT JOIN Table2 T2 ON
                    T1.schedule_nr = T2.schedule_nr AND
                    T1.part_number = T2.part_number+1
    

    【讨论】:

    • CDATE() 转换为 DATETIME 可以说不适合一段时间。 NZ() 仅适用于 Access UI,因此我会避免使用它。 LEFT JOIN 显式生成肯定要避免的空值(注意您使用 NZ() 最终避免它们)。否则投赞成票;)
    • 没错,如果可以的话,我会尽量避免使用NZ,因为它甚至不是 Jet / ACE SQL,而是 VBA 的一部分(我认为)。说虽然 MySQL 有 IFNULL 并且可能有 COALESCE(?)。我使用 LEFT JOIN 返回 part_number 1 的 NULLS,而不是在末尾用 UNION(或其他方式)添加它们 - 只是觉得它使查询更短,尽管不一定更快。我使用了CDATE,因此数据将以 OPs 最终表中显示的格式而不是整数形式出现。我确实喜欢你使用 currentprior - 比 T1T2 更好的别名。
    【解决方案2】:

    首先,将唯一的自动增量 ID 字段添加到您的表中(如果您没有)。

    然后将您的表与自身进行左连接:

    SELECT
        A.*
        , B.Date1 AS [Date2]
        , DateDiff ("n", A.Date1, B.Date1) AS [Difference]
    FROM
        YourTable AS A
            INNER JOIN
        YourTable AS B
            ON A.ID = B.ID - 1
    

    【讨论】:

    • 为什么需要自动编号字段? schedule_nrpart_number 唯一标识每条记录和运行顺序。
    • 如果呈现的数据只是他表中的数据,是的,你是对的。但是如果这个表也有其他记录,它可能不是唯一的。
    • 我仍然会使用提供的数据,因为这就是他所说的数据。您的 DateDiff 需要 n 而不是 m 分钟 - m 是几个月。
    • @DarrenBartrup-Cook,谢谢,我已经改了。
    【解决方案3】:

    从数据看来,您对“前行”的定义似乎是:

    • 具有相同的schedule_nr
    • part_number 减一(大假设**,即您的数据中没有空白)

    这可用于JOIN 的搜索条件。

    我们还需要考虑part_number = 1 的特殊情况,即当没有前一行时,则简单地默认为零。

    这两种情况可以UNION-ed在一起:

    SELECT current.schedule_nr, current.part_number, 
           DATEDIFF('N', prior.Date2, current.Date1) AS difference_in_minutes
      FROM YourTable AS prior
           INNER JOIN YourTable AS current
               ON prior.schedule_nr = current.schedule_nr
                  AND prior.part_number = ( current.part_number - 1 )
    UNION
    SELECT current.schedule_nr, 1 AS part_number,
           0 AS difference_in_minutes
      FROM YourTable AS current
     WHERE current.part_number = 1
    

    ** 如果schedule_nrpart_number 序列中存在间隙,则“前行”的谓词稍微复杂一些,即找到最大part_number 小于当前part_number 对于相同@ 987654331@.

    【讨论】:

    • 这个查询的小修改,看起来很不错,日期计算正确。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多