MS Access查询当前记录和先前记录之间的差异

时间:2016-09-12 12:16:21

标签: sql ms-access

我在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 |           |
------------|-------------|------|---------------|---------------|-----------|

在专栏#34;差异"我需要在上一行的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中将其作为一个查询执行?

向所有人寻求帮助和提示。看起来它现在有效。再次感谢。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

首先,如果您没有,请在表格中添加唯一自动增量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

答案 2 :(得分:0)

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

  • 具有相同的schedule_nr
  • part_number减去一个(很大的假设**你的数据没有空白)

这可用于JOIN的搜索条件。

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

这两个案例可以UNION - 一起编辑:

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

**如果part_number的{​​{1}}序列中存在间隙,那么“前一行”的谓词稍微复杂一点,即找到小于当前schedule_nr的最大值part_number {1}} part_number