我有一個查詢在那裏我被用戶爲特定的形式,指明瞭多於1投稿:如何縮小有限時間範圍內的查詢數量?
select userid, form_id, count(*)
from table_A
group by userid, form_id
having count(userid) > 1
不過,我想看看哪些用戶正在5秒的時間內提交超過1個表格(我們在此表中有提交時間戳的字段)。我如何按照這個標準縮小這個查詢的範圍?
我有一個查詢在那裏我被用戶爲特定的形式,指明瞭多於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())<= 5' –
一種方法是通過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(*)
。
您能否提供樣本輸入數據和預期輸出 –