2014-04-09 10 views
0

У меня есть таблица, которая выглядит следующим образом:запрос для подсчета записей в пределах диапазона времени SQL или Access Query

Row,TimeStamp,ID 
1,2014-01-01 06:01:01,5 
2,2014-01-01 06:00:03,5 
3,2014-01-01 06:02:00,5 
4,2014-01-01 06:02:39,5 

То, что я хочу сделать, это подсчитать количество записей для каждого идентификатора, однако я не хотите подсчитать записи, если последующий TimeStamp находится в пределах 30 секунд.

Итак, в приведенном выше примере общий счетчик для ID 5 будет равен 3, потому что он не будет считать строку 2, потому что она находится в пределах 30 секунд от последней отметки времени.

Я создаю приложение Microsoft Access и в настоящее время использую Query, поэтому этот запрос может быть либо запросом Access, либо SQL-запросом. Спасибо за помощь.

+0

Что вы уже пробовали? –

ответ

0

Я думаю, что следующий ниже запрос делает то, что вы хотите, но я не понимаю ваш ожидаемый результат. Он возвращает счет 4 (все строки в вашем примере), которые, как я считаю, будут правильными, потому что все ваши записи находятся на расстоянии не менее 30 секунд. Ни одна временная метка не имеет последующую временную метку в течение 30 секунд от нее (со временем).

Строка 2 с отметкой времени «2014-01-01 06:00:03» не находится в пределах 30 секунд после любой отметки времени. Ближайшим является строка # 1, которая на 58 секунд позже (58 больше 30, поэтому я не знаю, почему вы думаете, что ее следует исключить (учитывая то, что вы сказали, что хотите в своем объяснении)).

Строки 1/3/4 ваших данных примера также не находятся в пределах 30 секунд друг от друга.

Это испытание ниже SQL, но, как я сказал, он возвращает все 4 строки (изменение к отсчету, если вы хотите, граф, я привез строк, иллюстрирующий):

http://sqlfiddle.com/#!3/0d727/20/0

Теперь проверьте этот пример с некоторыми добавлениями данных: (я добавил пятую строку)

http://sqlfiddle.com/#!3/aee67/1/0

insert into tbl values ('2014-01-01 06:01:01',5); 
insert into tbl values ('2014-01-01 06:00:03',5); 
insert into tbl values ('2014-01-01 06:02:00',5); 
insert into tbl values ('2014-01-01 06:02:39',5); 
insert into tbl values ('2014-01-01 06:02:30',5); 

Обратите внимание, как Ресул запрос t показывает только 3 строки. Это связано с тем, что строка, добавленная мной (№ 5), находится в пределах 30 секунд после строки № 3, поэтому # 3 исключается. Строка №5 также исключается, потому что строка №4 равна 9 секундам (< = 30) позже.Строка №4 возвращается, потому что никакая последующая метка времени не может быть в пределах 30 секунд (никаких временных меток вообще нет).

запрос, чтобы получить деталь:

select * 
    from tbl t 
where not exists 
(select 1 
      from tbl x 
     where x.id = t.id 
      and x.timestamp > t.timestamp 
      and datediff(second, t.timestamp, x.timestamp) <= 30) 

запрос, чтобы получить счет на ID:

select id, count(*) 
    from tbl t 
where not exists 
(select 1 
      from tbl x 
     where x.id = t.id 
      and x.timestamp > t.timestamp 
      and datediff(second, t.timestamp, x.timestamp) <= 30) 
group by id 
+0

Итак, причина всего этого в том, что вы используете в Walk-a-thon для подсчета кругов. Я планирую, что кто-то вводит идентификационные номера в мое приложение, поскольку ходоки проходят (возможно, со сканером штрих-кода или несколько каким-то образом), но причина, по которой я хочу этот запрос, в том случае, если один и тот же человек вводится или проверяется дважды на одном и том же круге (я понял, что 30 секунд было бы хорошо. Имеет ли это значение? Извините, я думаю, что мой пример исходных данных, возможно, вводил в заблуждение. – user3513237

+0

Так что мой пример должен был иметь 2-ю строку с 06:01:03, таким образом это значение будет отброшено. Похоже, что ваш запрос делает именно то, что я хочу. – user3513237

+0

Как бы превратить это в запрос на подсчет? – user3513237

0

Насколько я знаю, это невозможно сделать только с помощью инструкции SQL, представленной.

Я использую два подхода:

  1. Для небольших наборов результатов, удалите излишки записи в ваших временных окнах в коде, а затем рассчитать соответствующую статистику. Главное преимущество этого подхода - вам не нужно изменять структуру базы данных.

  2. Добавить поле для отметки каждой записи относительно временного окна, затем использовать код для предварительной обработки ваших данных. & заполните индикатор. Теперь вы можете использовать SQL для агрегирования/фильтрации на основе нового столбца флага. Если вам необходимо отслеживать несколько окон времени, вы можете использовать несколько флагов/несколько столбцов (например, 30 второго окна, 600 второго окна и т.д.)

Для этого я рекомендую второй подход, он позволяет база данных (SQL) делает больше работы после того, как вы сделаете шаг предварительной обработки.