2013-05-24 4 views
3

Я работаю в Access 2010 с записями даты и времени (фотографии из камер-ловушек), которые означают посещения определенных животных (SpeciesID (0-10), AnimalID (1-20) на разные сайты камеры (StationID). чтобы вычислить количество и продолжительность посещений каждым AnimalID для каждого идентификатора станции.Как установить ограничение продолжительности события для определения «того же события» и «нового события» в запросе Access 2010 или SQL?

Проблема заключается в том, что иногда животные посещают одну и ту же станцию ​​несколько раз в тот же день. Я попытался выполнить запросы, которые группируют записи по дате и показывают, First of 'и' Last of 'datetime, но это просто дает дату и время первого и последнего записей этого животного на каждой станции в этот день, а не каждого отдельного визита.

Критерии, которые я хочу использовать «если последовательные записи одного и того же al, виды и станция> 20 минут друг от друга, то это отдельные посещения ». Я задаюсь вопросом, можно ли решить эту проблему, чтобы создать новое поле с запросом на обновление, которое дает каждому посетителю уникальный номер «VisitID», используя этот критерий, поэтому я могу затем группировать записи с помощью параметра VisitID для вычисления Первого и последнего datetime для каждого отдельного посещение? Может ли кто-нибудь предложить способ сделать это как запрос или SQL, или подумать о другом способе этого?

Таблица данных (так называемый Capture) выглядит следующим образом: CaptureID | StationID | SpeciesID | AnimalID | cDateTime

CaptureID является уникальным Autonumber для каждой записи. SpeciesID может быть 1-10, AnimalID может быть 1-20 (но AnimalID назначаются только для записей видов 1), StationID может быть 1-12, cDateTime может быть в любое время, когда ловушки камеры инициируются с помощью движения и отформатированы как DD/MM/YYYY hh: mm: ss. Я хочу, чтобы продолжительность посещения была отформатирована как hh: mm: ss.

Любая помощь или совет очень ценится !!

+0

Если животное посещает каждые десять минут в течение часа, это одно событие? –

+0

Также - можем ли мы считать, что AnimalId обозначает человека? –

+0

Да, поскольку они, вероятно, все еще находятся рядом с камерой, но только не на нее. – user2416916

ответ

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 действительно принадлежит в [животных] таблицах с другими деталями о том конкретном животном.

  2. Все значения VisitStart изначально имеют значение NULL. Это важно для одного из запросов ниже.

Для заполнения VisitStart, мы будем просто использовать cDateTime для любого захвата, который не имеет предыдущий захвата в течение 20 минут для того же AnimalID и StationID.

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   

Теперь мы можем заполнить в остальной части значений VisitStart путем нахождения наибольшего предыдущего VisitStart для этого AnimalID/StationID

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. Обратите внимание, что последний визит будет иметь нулевое значение, так как для него был только один захват.

+0

Привет, спасибо, что написал для меня SQL. Он работал отлично до запроса VisitEnd. Он сказал, что некоторые из записей не могут быть обновлены из-за ошибки типа преобразования. Любая идея, почему это может быть? Похоже, что только обновленные записи были те, у которых время VisitEnd такое же, как время VisitStart ...? – user2416916

+0

@ user2416916 Имеются ли [cDateTime], [VisitStart] и [VisitEnd] все столбцы Access 'Date/Time'? –

+0

Да, все поля даты и времени и формат Общие Дата – user2416916

0

Вы можете определить on insert trigger для таблицы захвата и новое поле «VisitStart».

Спусковой бы в псевдокоде:

Поиск любой записи с датой захвата + AnimalID в течение 20 минут от этого захвата.

Если существует, то зайдите в его поле VisitStart, чтобы заполнить новый посетитель Locator .

Если этого не существует, установите новый параметр VisitStart для Capture Date.

Я понимаю, что это не поможет вам с вашими существующими данными, но одноразовый процесс переназначения системы должен быть возможен.

Какой-нибудь хороший?

+0

Это могло бы работать да, и, я полагаю, написать подобный триггер для VisitEnd? – user2416916

+0

хотя, когда я добавляю новые записи в таблицу Capture, animalID не назначается сразу, поэтому запрос будет лучше ... – user2416916

+0

VisitEnd можно было бы вычислить - 'Max (VisitDate) группой от VisitStart'. Запрос будет (почти) невозможным из-за необходимости последовательной логики. Разумеется, вы могли бы создать процедуру предварительной обработки, чтобы выполнить эти вычисления, чтобы легко получить запрос. –