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-啊,当然,是的,你完全正确。感谢您的好意:您能提供示例输入数据和预期输出吗