考虑下表:
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:23,2:30)来制作一张桌子,但也不愿意。 (我仍然不知道如何使用该表。)
非常感谢任何帮助: - )
答案 0 :(得分: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 :(得分:4)
我想我可以用半小时(00:00,00:30,01:00,01:30,...... 23:23,2: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
答案 2 :(得分:3)
尝试以这种方式分组:
group by hour(_time), floor(minute(_time)/30)