2012-04-08 28 views
2

考慮下表:如何統計每半小時的郵件數量?

msg_id _time 
------------- 
1  13:32 
2  13:56 
3  14:05 
4  15:00 
5  15:17 
6  15:28 
7  16:40 

我目前聚集每小時的消息數,具體如下:

SELECT HOUR(_time) AS hour, COUNT(msg_id) AS cnt FROM messages GROUP BY hour 
ORDER BY hour 

這將導致一個結果如下:

hour cnt 
--------- 
13 2 
14 1 
15 3 
16 1 

然而,我想要的是每一半的計數小時:

hour cnt 
---------- 
13:30 2 
14:00 1 
14:30 0 
15:00 3 
15:30 0 
16:00 0 
16:30 1 

什麼是使這成爲可能的查詢?如果有必要,我想我可以用半小時時間(00:00,00:30,01:00,01:30,... 23:00,23:30)將一張桌子換成一張桌子,但不要太過分。 (我仍然不知道如何使用該表)。

任何幫助:-)

+0

爲什麼該列仍稱爲「小時」?也許「時間」會更合適? – 2012-04-08 20:47:27

+0

除了小時數之外,您可以將分鐘數(_time)除以30並將其除以該值。您可能需要將結果轉換爲int,我不確定。 – 2012-04-08 20:51:04

+0

嘿!有沒有解決你的問題?如果是,請將解決該問題的答案標記爲幫助他人的正確答案。如果沒有,請給我們反饋意見。 – rcdmk 2017-09-15 16:14:46

回答

5

您可以使用case when

SELECT COUNT(msg_id) AS cnt, CONCAT(CAST(HOUR(_TIME) AS CHAR(2)), ':', (CASE WHEN MINUTE(_time) < 30 THEN '00' ELSE '30' END)) AS hour 
FROM messages 
GROUP BY CONCAT(CAST(HOUR(_TIME) AS CHAR(2)), ':', (CASE WHEN MINUTE(_time) < 30 THEN '00' ELSE '30' END)) 
ORDER BY hour 
+1

謝謝!我已經將你的和aleroot的查詢結合起來了,因爲你的結果集中顯示了10:30,11:00,11:30等半小時,但它沒有正確排序。輸出結果如下:'0:00,0:30,10:00,10:30',我不太明白如何解決這個問題。所以我編制了'SELECT CONCAT(CAST(HOUR(nyse_time)AS CHAR(2)),':',(CASE WHEN MINUTE(nyse_time)<30 THEN'00'ELSE'30'END))半小時, COUNT(tweet_id)AS cnt FROM tweets GROUP BY HOUR(nyse_time),FLOOR(MINUTE(nyse_time)/ 30)' – Pr0no 2012-04-08 22:12:37

+1

很好,你已經做到了。要以更好的方式排序,您必須按HOUR(_TIME)ASC,MINUTE(_TIME)ASC – rcdmk 2012-04-08 22:29:44

4

是極大的讚賞,我想我可以mkae一個表,在半小時的時間(00:00,00:30,01:00,01:30,.. 。23:00,23:30),但不要太。

是的,如果您被迫使用MySQL,這是正確的解決方案。做另一種方式是可能的,但可能會變得混亂,並會變慢。

(我仍然不知道如何使用該表可能)

使用LEFT JOIN:

SELECT 
    halfhours.start AS hour, 
    COUNT(*) AS count 
FROM halfhours 
LEFT JOIN messages 
ON messages._time >= halfhours.start AND messages._time < halfhours.end 
GROUP BY halfhours.start 
+0

謝謝!這就是我的想法,但看看其他建議,這可能在沒有幫助表的MySQL中:-) – Pr0no 2012-04-08 22:15:03

3

以這種方式嘗試按:

group by hour(_time), floor(minute(_time)/30) 
+0

Thakns!爲了在結果集中得到'10:30,11:00,11:30等',我使用了rcdmk查詢的一部分:'SELECT CONCAT(CAST(HOUR(nyse_time)AS CHAR(2)),': ',(CASE WHEN MINUTE(nyse_time)<30 THEN'00'ELSE'30'END))AS halfhour, COUNT(tweet_id)AS cnt FROM tweets GROUP BY HOUR(nyse_time),FLOOR(MINUTE(nyse_time)/ 30)' – Pr0no 2012-04-08 22:11:28