您可以使用相关子查询来获取下一个timestamp
对于每一行。
SELECT
i.status,
i.timestamp,
(
SELECT Min([timestamp])
FROM importedData
WHERE [timestamp] > i.timestamp
) AS next_timestamp
FROM importedData AS i
WHERE i.timestamp BETWEEN #2013-11-29 06:00:00#
AND #2013-11-29 18:00:00#;
然后,您可以将该查询用作另一个查询中的子查询,在其中计算之间的持续时间timestamp
and next_timestamp
。然后在第三个查询中使用整个新查询作为子查询GROUP BY status
并计算每个状态的总持续时间。
这是我在 Access 2007 中测试的版本...
SELECT
sub2.status,
Format(Sum(Nz(sub2.duration,0)), 'hh:nn:ss') AS SumOfduration
FROM
(
SELECT
sub1.status,
(sub1.next_timestamp - sub1.timestamp) AS duration
FROM
(
SELECT
i.status,
i.timestamp,
(
SELECT Min([timestamp])
FROM importedData
WHERE [timestamp] > i.timestamp
) AS next_timestamp
FROM importedData AS i
WHERE i.timestamp BETWEEN #2013-11-29 06:00:00#
AND #2013-11-29 18:00:00#
) AS sub1
) AS sub2
GROUP BY sub2.status;
如果遇到麻烦或需要修改它,请分解最里面的子查询,sub1,并自行测试。然后做同样的事情sub2。我怀疑你会想要改变WHERE
子句使用参数而不是硬编码时间。
注意查询Format
如果您的持续时间超过 24 小时,则表达式将不合适。这是一个即时窗口会话,它说明了问题......
' duration greater than one day:
? #2013-11-30 02:00# - #2013-11-29 01:00#
1.04166666667152
' this Format() makes the 25 hr. duration appear as 1 hr.:
? Format(#2013-11-30 02:00# - #2013-11-29 01:00#, "hh:nn:ss")
01:00:00
但是,如果您只处理 12 小时的数据。转变,这应该不是问题。请记住这一点,以防您需要分析跨度超过 24 小时的数据。
如果子查询不熟悉,请参阅 Allen Browne 的页面:子查询基础知识 http://allenbrowne.com/subquery-01.html。他在标题为“相关子查询”的部分中讨论了相关子查询获取另一条记录中的值.