2013-03-27 87 views
0

我的表像:計算行之間間隔數

+---------+---------+------------+-----------------------+---------------------+ 
| visitId | userId | locationId | comments    | time    | 
+---------+---------+------------+-----------------------+---------------------+ 
|  1 | 3 |  12  | It's a good day here! | 2012-12-12 11:50:12 | 
+---------+---------+------------+-----------------------+---------------------+ 
|  2 | 3 |  23  | very beautiful  | 2012-12-12 12:50:12 | 
+---------+---------+------------+-----------------------+---------------------+ 
|  3 | 3 |  52  | nice     | 2012-12-12 13:50:12 | 
+---------+---------+------------+-----------------------+---------------------+ 

它記錄遊客的軌跡和對地的一些意見參觀

我想算在訪問一個特定的地方遊客數量(ID說3227 =)從0:00到23:59,在幾個間隔(即30分鐘)

我試圖做這由:

SELECT COUNT(*) FROM visits 
GROUP BY HOUR(time), SIGN(MINUTE(time) - 30)// if they are in the same interval this will yield the same result 
WHERE locationId=3227 

的問題是,如果沒有記錄,在某些區間下降,這將不會返回時間間隔與次數爲0。例如,有沒有觀衆來自02訪問位置:00至03:00,這不會給我間隔02:00-02:29和02:30 -2:59。

我想要一個確切大小48(每半小時一個)的結果,我該怎麼做?

+1

@Rono感謝您的幫助! – zoujyjs 2013-03-27 01:32:45

回答

2

你必須創建一個表所需的48行,並使用左外連接:

select n.hr, n.hr, coalesce(v.cnt, 0) as cnt 
from (select 0 as hr, -1 as sign union all 
     select 0, 1 union all 
     select 1, -1 union all 
     select 1, 1 union all 
     . . . 
     select 23, -1 union all 
     select 23, 1 union all 
    ) left outer join 
    (SELECT HOUR(time) as hr, SIGN(MINUTE(time) - 30) as sign, COUNT(*) as cnt 
     FROM visits 
     WHERE locationId=3227 
     GROUP BY HOUR(time), SIGN(MINUTE(time) - 30) 
    ) v 
    on n.hr = v.hr and n.sign = v.sign 
order by n.hr, n.hr 
+0

這個工作,但它是痛苦輸入這麼長的聲明..謝謝! – zoujyjs 2013-03-27 01:46:48