这是我的解决方案。我的测试数据是
CaptureID AnimalID StationID cDateTime VisitStart VisitEnd
--------- -------- --------- ------------------- ------------------- -------------------
1 1 1 2013-05-21 08:00:00
2 2 1 2013-05-21 08:02:00
3 1 1 2013-05-21 08:07:00
4 2 1 2013-05-21 08:21:00
5 1 1 2013-05-21 08:28:00
笔记:
我省略了 SpeciesID,因为 AnimalID 是唯一标识符,因此 SpeciesID 确实属于 [Animals] 表以及有关该特定动物的其他详细信息。
所有 VisitStart 值最初都是 NULL。这对于以下查询之一很重要。
要填充 VisitStart,对于相同 AnimalID 和 StationID 的任何在 20 分钟内没有先前捕获的捕获,我们将只使用 cDateTime。
UPDATE Captures SET VisitStart = cDateTime
WHERE NOT EXISTS
(
SELECT * FROM Captures c2
WHERE c2.AnimalID=Captures.AnimalID AND c2.StationID=Captures.StationID
AND c2.cDateTime<Captures.cDateTime
AND c2.cDateTime>=DateAdd("n", -20, Captures.cDateTime)
)
这给了我们离散访问的开始时间:
CaptureID AnimalID StationID cDateTime VisitStart VisitEnd
--------- -------- --------- ------------------- ------------------- -------------------
1 1 1 2013-05-21 08:00:00 2013-05-21 08:00:00
2 2 1 2013-05-21 08:02:00 2013-05-21 08:02:00
3 1 1 2013-05-21 08:07:00
4 2 1 2013-05-21 08:21:00
5 1 1 2013-05-21 08:28:00 2013-05-21 08:28:00
现在我们可以通过查找该 AnimalID/StationID 的最大先前 VisitStart 来填充其余的 VisitStart 值
UPDATE Captures
SET VisitStart = DMax("VisitStart", "Captures", "AnimalID=" & AnimalID & " AND StationID=" & StationID & " AND cDateTime<#" & Format(cDateTime, "yyyy-mm-dd Hh:Nn:Ss") & "#")
WHERE VisitStart IS NULL
这给了我们
CaptureID AnimalID StationID cDateTime VisitStart VisitEnd
--------- -------- --------- ------------------- ------------------- -------------------
1 1 1 2013-05-21 08:00:00 2013-05-21 08:00:00
2 2 1 2013-05-21 08:02:00 2013-05-21 08:02:00
3 1 1 2013-05-21 08:07:00 2013-05-21 08:00:00
4 2 1 2013-05-21 08:21:00 2013-05-21 08:02:00
5 1 1 2013-05-21 08:28:00 2013-05-21 08:28:00
类似的查询可以计算 VisitEnd 值
UPDATE Captures
SET VisitEnd = DMax("cDateTime", "Captures", "AnimalID=" & AnimalID & " AND StationID=" & StationID & " AND VisitStart=#" & Format(VisitStart, "yyyy-mm-dd Hh:Nn:Ss") & "#")
结果是
CaptureID AnimalID StationID cDateTime VisitStart VisitEnd
--------- -------- --------- ------------------- ------------------- -------------------
1 1 1 2013-05-21 08:00:00 2013-05-21 08:00:00 2013-05-21 08:07:00
2 2 1 2013-05-21 08:02:00 2013-05-21 08:02:00 2013-05-21 08:21:00
3 1 1 2013-05-21 08:07:00 2013-05-21 08:00:00 2013-05-21 08:07:00
4 2 1 2013-05-21 08:21:00 2013-05-21 08:02:00 2013-05-21 08:21:00
5 1 1 2013-05-21 08:28:00 2013-05-21 08:28:00 2013-05-21 08:28:00
计算访问持续时间只需DateDiff()
在 VisitStart 和 VisitEnd 上使用。请注意,最后一次访问的持续时间为零,因为它只有一次捕获。