2015-09-26 23 views
0

我有櫃檯和計數像這樣的SQLite數據庫:SQLite查詢;集團按小時和設備

 DateTime  |Gate|Count 
-----------------------+----+----- 
2015-09-23T19:23:01.000| 2| 345 
2015-09-23T19:41:08.000| 2| 346 
2015-09-23T19:41:30.000| 3| 654 
2015-09-23T19:44:00.000| 4| 556 
2015-09-23T21:13:47.000| 2| 348 

我想確定每小時每個門的計數值。在上面的表中,#2號門在19:00小時內計數爲1,在21:00小時內計數爲2。

我設法以下select語句:

SELECT strftime('%Y-%m-%dT%H:00:00.000', DateTime), 
      max(Count) - min(Count) 
FROM GateTbl 
WHERE Gate='2' 
GROUP by strftime('%Y-%m-%dT%H:00:00.000', DateTime); 

似乎起初,我是在正確的軌道上,因爲這幾乎沒有我想要的東西。但是,當我想要返回所有門的小時計數時,它一次只適用於一個門。我也意識到它不能像上面21點那樣工作,那裏只有一個小時。

我看不到在SQL語句中這樣做的方法,我希望這裏有人可以。任何幫助表示讚賞。

+0

'但它只適用於一個時間一個門'。是。這就是'WHERE Gate ='2'的意思。 – njzk2

回答

2

你只需要添加Gategroup byselect

SELECT gate, strftime('%Y-%m-%dT%H:00:00.000', DateTime), 
     max(Count) - min(Count) 
FROM GateTbl 
GROUP by gate, strftime('%Y-%m-%dT%H:00:00.000', DateTime); 

編輯:

哎呀,我們對此深感抱歉。你實際需要的是從下一個小時的第一個計數。 SQL有很好的功能,lag()。但不是SQLite。但是,你可以使用相關子查詢做到這一點:

WITH gh as (
     SELECT gate, strftime('%Y-%m-%dT%H:00:00.000', DateTime) as dt, 
      MIN(Count) as mincount, MAX(count) as maxcount 
     FROM GateTbl 
     GROUP by gate, strftime('%Y-%m-%dT%H:00:00.000', DateTime) 
    ) 
SELECT gh.gate, gh.dt, 
     COALESCE(gh.next_mincount, gh.maxcount) - gh.mincount 
FROM (SELECT gh.*, 
      (SELECT gh2.mincount 
       FROM gh gh2 
       WHERE gh2.gate = gh.gate AND gh2.dt > gh.dt 
       ORDER BY gh2.dt 
       LIMIT 1 
      ) as next_mincount 
     FROM gh 
    ) gh; 

coalesce()就是一個鐘頭。這使用了那個小時內的最後一個時間戳。如果只有一個,那麼你將在那個小時得到0。

+0

這非常有幫助。謝謝!但是它並沒有解決第二個問題,即如果只有一個小時只有一個條目,就可以正確計數。在示例表格中,Gate 2在21:00時應計爲2,但返回0. –

+1

@IAmNotADBA。 。 。關鍵是從*下一個*小時開始計數。這意味着您的小時計數應該正確彙總 - 也就是說,一切都將被計算在內。缺點是在行之間的某些值將在第一個小時計算,這些值可能實際在第二個小時發生,但這是數據結構中固有的危險。 –