2014-04-09 39 views
0

我有一個表,看起來像這樣:查詢計數時間範圍SQL或Access查詢中的記錄

Row,TimeStamp,ID 
1,2014-01-01 06:01:01,5 
2,2014-01-01 06:00:03,5 
3,2014-01-01 06:02:00,5 
4,2014-01-01 06:02:39,5 

我想做的是統計的每個ID記錄的數目,但我不知道如果後續時間戳在30秒內,則要計數記錄。

所以在我上面的例子中,ID 5的總數是3,因爲它不會計算第2行,因爲它在最後一個時間戳的30秒內。

我正在構建一個Microsoft Access應用程序,並且當前正在使用查詢,所以此查詢可以是Access查詢或SQL查詢。感謝您的幫助。

+0

你有什麼已經嘗試過? –

回答

0

我認爲下面的查詢做你想要的,但我不明白你的預期輸出。它返回一個4(所有你的例子中的行),我相信這是正確的,因爲你所有的記錄至少相距30秒。沒有單個時間戳在它之後的30秒內(及時)具有隨後的時間戳。

時間戳爲'2014-01-01 06:00:03'的第2行不在任何時間戳之後的30秒內。最接近的是58秒後的第一排(58大於30,所以我不知道爲什麼你認爲它應該被排除在外(因爲你說你想在你的解釋中說出你的意思))。

您的示例數據的1/3/4行也不在彼此的30秒內。

這是下面的SQL的測試,但就像我說的,它返回的所有4行(如果你想計數的變化向計,我帶回來說明行):

http://sqlfiddle.com/#!3/0d727/20/0

現在檢查增加了一些數據這個例子:(我加了第五行)

http://sqlfiddle.com/#!3/aee67/1/0

insert into tbl values ('2014-01-01 06:01:01',5); 
insert into tbl values ('2014-01-01 06:00:03',5); 
insert into tbl values ('2014-01-01 06:02:00',5); 
insert into tbl values ('2014-01-01 06:02:39',5); 
insert into tbl values ('2014-01-01 06:02:30',5); 

注意如何查詢resul t只顯示3行。這是因爲我添加的行(#5)在行#3的30秒內,所以排除#3。第5行也被排除,因爲第4行比它晚9秒(< = 30)。第4行會回來,因爲沒有後續時間戳在30秒內(根本沒有後續時間戳)。

查詢來獲取細節:

select * 
    from tbl t 
where not exists 
(select 1 
      from tbl x 
     where x.id = t.id 
      and x.timestamp > t.timestamp 
      and datediff(second, t.timestamp, x.timestamp) <= 30) 

查詢通過ID來獲得計數:

select id, count(*) 
    from tbl t 
where not exists 
(select 1 
      from tbl x 
     where x.id = t.id 
      and x.timestamp > t.timestamp 
      and datediff(second, t.timestamp, x.timestamp) <= 30) 
group by id 
+0

所以所有這一切的原因是爲了使用在一個步行通過計數圈。我打算找人輸入ID號到我的應用程序作爲步行者由去(可能帶有條形碼掃描儀或多個以某種方式),但我想這個查詢的原因是情況相同的人進入或在同一圈掃描兩次(這是我想通30秒將是一件好事。這是否有道理?對不起,我想我的原始數據例如可能是誤導性的。 – user3513237

+0

所以我的例子應該有過6時01分03秒第2行時間,因此這個值被丟棄。它看起來像查詢不正是我想要的東西。謝謝。 – user3513237

+0

我怎麼會變成一個數查詢? – user3513237

0

據我所知,僅僅使用所提供的SQL語句是不可能的。

我用兩種方法:

  1. 對於小的結果集,去除多餘的記錄裏面代碼的時間窗口,然後計算出相關的統計數據。這種方法的主要優點是不必更改數據庫結構。

  2. 添加一個字段來標記每個記錄相對於時間窗口,然後使用代碼來預處理您的數據&填充指標。您現在可以使用SQL根據新標誌列進行聚合/過濾。如果您需要跟蹤多個時間窗口,您可以使用多個標誌/多列(例如,30秒窗口600第二個窗口等)

對於這一點,我建議第二種方法,它允許在完成預處理步驟後,數據庫(SQL)會執行更多的工作。