查询在SQL或Access Query的时间范围内计算记录

时间:2014-04-09 01:30:36

标签: sql ms-access timestamp

我有一个看起来像这样的表:

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的记录数,但是如果后续TimeStamp在30秒内,我不想计算记录。

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

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

2 个答案:

答案 0 :(得分:0)

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

我使用两种方法:

  1. 对于小结果集,请在代码中删除时间窗口内的剩余记录,然后计算相关统计信息。这种方法的主要优点是您不必更改数据库结构。

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

  3. 为此,我建议采用第二种方法,它允许数据库(SQL)在完成预处理步骤后做更多的工作。

答案 1 :(得分:0)

我认为下面的查询会做你想要的但是我不理解你的预期输出。它返回一个4(你的例子中的所有行)的数量,我认为这是正确的,因为你的所有记录至少相隔30秒。没有一个时间戳在30秒内有一个后续时间戳(及时)。

时间戳为“2014-01-01 06:00:03”的第2行不会在任何时间戳之后的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);

请注意查询结果仅显示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