3

我在 Access 2010 中使用带有日期时间戳的记录(来自相机陷阱的照片)表示特定动物(SpeciesID(0-10),AnimalID(1-20)对不同相机站点(StationID)的访问。我想计算每个 AnimalID 访问每个 StationID 的次数和持续时间。

问题是有时动物会在同一天多次访问同一个站点。我尝试过按日期对记录进行分组并显示日期时间字段的“第一个”和“最后一个”的查询,但这只是给出了当天每个车站该动物的第一个和最后一个记录的日期时间,而不是每次单独访问。

我想使用的标准是“如果同一动物、物种和站点的连续记录相隔> 20分钟,那么它们是单独的访问”。我想知道解决这个问题的方法是否是使用更新查询创建一个新字段,该字段使用此条件为每次访问提供一个唯一的“访问 ID”编号,因此我可以按访问 ID 对记录进行分组,以计算每个单独的第一个和最后一个日期时间访问?任何人都可以提出一种方法来作为查询或在 SQL 中执行此操作,或者考虑另一种方法吗?

我的数据表(称为 Capture)的布局如下: CaptureID | 站号 | 物种ID | 动物ID | c日期时间

CaptureID 是每条记录的唯一自动编号。SpeciesID 可以是 1-10,AnimalID 可以是 1-20(但 AnimalID 只分配给 Species 1 的记录),StationID 可以是 1-12,cDateTime 可以是任何时间,因为相机陷阱是运动触发的,并且被格式化作为 DD/MM/YYYY hh:mm:ss。我希望将访问持续时间格式化为 hh:mm:ss。

非常感谢任何帮助或建议!

4

2 回答 2

2

这是我的解决方案。我的测试数据是

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                      

笔记:

  1. 我省略了 SpeciesID,因为 AnimalID 是唯一标识符,因此 SpeciesID 确实属于 [Animals] 表以及有关该特定动物的其他详细信息。

  2. 所有 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 上使用。请注意,最后一次访问的持续时间为零,因为它只有一次捕获。

于 2013-05-24T12:47:41.437 回答
0

您可以on insert trigger为捕获表定义一个新字段“ VisitStart”。

触发器将在伪代码中:

在此捕获的 20 分钟内搜索具有捕获日期 + AnimalId 的任何记录。

如果存在,则使用其 VisitStart 字段来填充新记录的 VisitStart。

如果不存在,则将新的 VisitStart 设置为 Capture Date。

我意识到这对您现有的数据没有帮助,但应该可以使用一次性的过程来对系统进行泵送。

有什么好处吗?

于 2013-05-24T10:26:59.577 回答