2017-04-05 52 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(*)