2017-04-05 37 views
2

我有一个查询在那里我被用户为特定的形式,指明了多于1投稿:如何缩小有限时间范围内的查询数量?

select userid, form_id, count(*) 
from table_A 
group by userid, form_id 
having count(userid) > 1 

不过,我想看看哪些用户正在5秒的时间内提交超过1个表格(我们在此表中有提交时间戳的字段)。我如何按照这个标准缩小这个查询的范围?

+0

您能否提供样本输入数据和预期输出 –

回答

2

@nikotromus

您尚未提供有关您的架构和其他可用列的详细信息,也未提供有关此信息将在何处以及如何使用的信息。

但是,如果你想这样做“活”,所以比较结果在你对当前的时间戳时它看起来是这样的:

SELECT userid, form_id, count(*) 
    FROM table_A 
WHERE DATEDIFF(SECOND,YourColumnWithSubmissionTimestamp, getdate()) <= 5 
GROUP BY userid, form_id 
HAVING count(userid) > 1 
+0

为什么不在'YourColumnWithSubmissionTimestamp'和'getdate()'之间使用一个datediff? –

+0

@ZoharPeled - 你的意思是这样的:WHERE:DATEDIFF(SECOND,'19000101',getdate() - YourColumnWithSubmissionTimestamp)?我现在无法测试这个想法,因此发布了一些我期望能够发挥作用的东西。感谢评论,但! – morb1d

+0

不,我的意思是这样的:'WHERE DATEDIFF(SECOND,YourColumnWithSubmissionTimestamp,getdate())<= 5' –

2

一种方法是通过DATEDIFF(Second, '2017-01-01', SubmittionTimeStamp)/5添加到群组中。
基于用户标识,form_id和五秒的间隔这将组记录:

select userid, form_id, count(*) 
from table_A 
group by userid, form_id, datediff(Second, '2017-01-01', SubmittionTimeStamp)/5 
having count(userid) > 1 

this SO post了更详细的解释。

+1

这将在五秒钟的时间间隔内对它们进行分组。如果一个记录在下一个时间间隔的开始时在一个时间间隔结束时而另一个记录在哪里? – GurV

+0

这是一个很好的观点。没想过。不过,我认为morb1d可能会提出最简单的解决方案。我们可能应该考虑一个......也就是说,如果OP意味着在最后5秒内获得用户。 –

+0

从现在开始只能在5秒内工作,对吧? – GurV

2

您可以使用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; 

更多解释见这样的回答:

+1

我觉得很好,我们都在回收答案。非常环境:-) –

+0

@ZoharPeled - :) – GurV

+0

当我尝试运行它时遇到此错误...消息535,级别16,状态0,行1 datediff函数导致溢出。分隔两个日期/时间实例的日期部分数量太大。尝试使用不精确的日期部分的datediff。 – nikotromus

0

我只想用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 bycount(*)