Sql 如何在有限的时间范围内缩小计数查询?
我有一个查询,其中我识别了一个以上用户提交的特定表单:Sql 如何在有限的时间范围内缩小计数查询?,sql,sql-server,Sql,Sql Server,我有一个查询,其中我识别了一个以上用户提交的特定表单: select userid, form_id, count(*) from table_A group by userid, form_id having count(userid) > 1 但是,我正在尝试查看哪些用户在5秒钟的时间范围内提交了超过1个表单。我们在这个表中有一个提交时间戳字段。如何根据该标准缩小查询范围?一种方法是按DATEDIFFSecond添加到组中,“2017-01-01”,SubmitionTimeStam
select userid, form_id, count(*)
from table_A
group by userid, form_id
having count(userid) > 1
但是,我正在尝试查看哪些用户在5秒钟的时间范围内提交了超过1个表单。我们在这个表中有一个提交时间戳字段。如何根据该标准缩小查询范围?一种方法是按DATEDIFFSecond添加到组中,“2017-01-01”,SubmitionTimeStamp/5。 这将根据userid、form_id和5秒的间隔对记录进行分组:
select userid, form_id, count(*)
from table_A
group by userid, form_id, datediff(Second, '2017-01-01', SubmittionTimeStamp) / 5
having count(userid) > 1
请阅读以获得更详细的解释。您可以使用lag来形成彼此相隔5秒的行组,然后对它们进行聚合:
select distinct userid,
form_id
from (
select t.*,
sum(val) over (
order by t.submission_timestamp
) as grp
from (
select t.*,
case
when datediff(ms, lag(t.submission_timestamp, 1, t.submission_timestamp) over (
order by t.submission_timestamp
), t.submission_timestamp) > 5000
then 1
else 0
end val
from your_table t
) t
) t
group by userid,
form_id,
grp
having count(*) > 1;
有关更多说明,请参见此答案:
@尼科特罗姆斯
您没有提供很多关于您的模式和其他可用列的详细信息,也没有提供关于使用这些信息的内容/方式和位置的详细信息
但是,如果您希望实时执行,则将您的时间结果与当前时间戳进行比较,结果如下所示:
SELECT userid, form_id, count(*)
FROM table_A
WHERE DATEDIFF(SECOND,YourColumnWithSubmissionTimestamp, getdate()) <= 5
GROUP BY userid, form_id
HAVING count(userid) > 1
我只想使用exists来获取用户:
select userid, form_id
from table_A a
where exists (select 1
from table_A a2
where a2.userid = a.userid and a2.timestamp >= a.timestamp and a2.timestamp < dateadd(second, 5, a.timestamp
);
如果你想要一个计数,你可以加上group by和count*我发现我们都在循环使用答案,这很好。非常环保:-@ZoharPeled-:在我尝试运行它时出现此错误。。。Msg 535,级别16,状态0,第1行datediff函数导致溢出。分隔两个日期/时间实例的DatePart数量太多。尝试使用datediff和不太精确的datepart。@nikotromus-startdate和enddate之间的最大差异是24天20小时31分23.647秒。如果您尝试在datediffseconds中将其更改为秒,…>5.秒的范围是68年这将在五秒钟的时间间隔内对它们进行分组。如果一条记录在一个区间的末尾,而另一条记录在下一个区间的最开始会怎样?这是一个很好的观点。我没想过。然而,我认为morb1d可能会想出最简单的解决方案。一个我们都应该考虑的。。。。也就是说,如果OP的意思是在最后5秒钟内获得用户,那么从现在起这只在5秒钟内有效,对吗?OP想要的就是你的我希望这也是他们需要的…:-为什么不在带有SubmissionTimeStamp的列和getdate之间使用一个datediff?@ZoharPeled-你的意思是这样的:DATEDIFFSECOND,'19000101',getdate-带有SubmissionTimeStamp的列?我现在无法测试这个想法,因此发布了一些我认为会奏效的东西。谢谢你的评论!不,我的意思是这样的:WHERE DATEDIFFSECOND,你的带有submissiontimestamp的专栏,getdate@ZoharPeled-啊,当然,是的,你完全正确。感谢您的好意:您能提供示例输入数据和预期输出吗