2014-04-09 38 views
0

我有一个表,看起来像这样:查询计数时间范围SQL或Access查询中的记录

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 

我想做的是统计的每个ID记录的数目,但我不知道如果后续时间戳在30秒内,则要计数记录。

所以在我上面的例子中,ID 5的总数是3,因为它不会计算第2行,因为它在最后一个时间戳的30秒内。

我正在构建一个Microsoft Access应用程序,并且当前正在使用查询,所以此查询可以是Access查询或SQL查询。感谢您的帮助。

+0

你有什么已经尝试过? –

回答

0

我认为下面的查询做你想要的,但我不明白你的预期输出。它返回一个4(所有你的例子中的行),我相信这是正确的,因为你所有的记录至少相距30秒。没有单个时间戳在它之后的30秒内(及时)具有随后的时间戳。

时间戳为'2014-01-01 06:00:03'的第2行不在任何时间戳之后的30秒内。最接近的是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); 

注意如何查询resul t只显示3行。这是因为我添加的行(#5)在行#3的30秒内,所以排除#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

所以所有这一切的原因是为了使用在一个步行通过计数圈。我打算找人输入ID号到我的应用程序作为步行者由去(可能带有条形码扫描仪或多个以某种方式),但我想这个查询的原因是情况相同的人进入或在同一圈扫描两次(这是我想通30秒将是一件好事。这是否有道理?对不起,我想我的原始数据例如可能是误导性的。 – user3513237

+0

所以我的例子应该有过6时01分03秒第2行时间,因此这个值被丢弃。它看起来像查询不正是我想要的东西。谢谢。 – user3513237

+0

我怎么会变成一个数查询? – user3513237

0

据我所知,仅仅使用所提供的SQL语句是不可能的。

我用两种方法:

  1. 对于小的结果集,去除多余的记录里面代码的时间窗口,然后计算出相关的统计数据。这种方法的主要优点是不必更改数据库结构。

  2. 添加一个字段来标记每个记录相对于时间窗口,然后使用代码来预处理您的数据&填充指标。您现在可以使用SQL根据新标志列进行聚合/过滤。如果您需要跟踪多个时间窗口,您可以使用多个标志/多列(例如,30秒窗口600第二个窗口等)

对于这一点,我建议第二种方法,它允许在完成预处理步骤后,数据库(SQL)会执行更多的工作。