我有一个看起来像这样的表:
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查询。谢谢你的帮助。
答案 0 :(得分:0)
据我所知,不可能仅使用所提供的SQL语句。
我使用两种方法:
对于小结果集,请在代码中删除时间窗口内的剩余记录,然后计算相关统计信息。这种方法的主要优点是您不必更改数据库结构。
添加一个字段来标记相对于时间窗口的每条记录,然后使用代码预处理您的数据和数据。填写指标。您现在可以使用SQL根据新标志列进行聚合/过滤。如果您需要跟踪多个时间窗口,您可以使用多个标志/多列(例如30秒窗口,600秒窗口等)
为此,我建议采用第二种方法,它允许数据库(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