如何缩小有限时间范围内的查询数量?
我有一个查询在那里我被用户为特定的形式,指明了多于1投稿:如何缩小有限时间范围内的查询数量?
select userid, form_id, count(*)
from table_A
group by userid, form_id
having count(userid) > 1
不过,我想看看哪些用户正在5秒的时间内提交超过1个表格(我们在此表中有提交时间戳的字段)。我如何按照这个标准缩小这个查询的范围?
@nikotromus
您尚未提供有关您的架构和其他可用列的详细信息,也未提供有关此信息将在何处以及如何使用的信息。
但是,如果你想这样做“活”,所以比较结果在你对当前的时间戳时它看起来是这样的:
SELECT userid, form_id, count(*)
FROM table_A
WHERE DATEDIFF(SECOND,YourColumnWithSubmissionTimestamp, getdate()) <= 5
GROUP BY userid, form_id
HAVING count(userid) > 1
为什么不在'YourColumnWithSubmissionTimestamp'和'getdate()'之间使用一个datediff? –
@ZoharPeled - 你的意思是这样的:WHERE:DATEDIFF(SECOND,'19000101',getdate() - YourColumnWithSubmissionTimestamp)?我现在无法测试这个想法,因此发布了一些我期望能够发挥作用的东西。感谢评论,但! – morb1d
不,我的意思是这样的:'WHERE DATEDIFF(SECOND,YourColumnWithSubmissionTimestamp,getdate())
一种方法是通过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了更详细的解释。
您可以使用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;
更多解释见这样的回答:
我觉得很好,我们都在回收答案。非常环境:-) –
@ZoharPeled - :) – GurV
当我尝试运行它时遇到此错误...消息535,级别16,状态0,行1 datediff函数导致溢出。分隔两个日期/时间实例的日期部分数量太大。尝试使用不精确的日期部分的datediff。 – nikotromus
我只想用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(*)
。
您能否提供样本输入数据和预期输出 –