如何用GROUP BY子句写HOUR的MYSQL查询,如果特定时间没有数据,则返回0

时间:2019-01-09 06:35:11

标签: mysql

我想编写MYSQL查询来获取数据,我想计算每小时发送的SMS,以小时为单位,如果某个小时没有数据,则应返回0。

此外,我也想像在预期结果中一样对前9小时和后3小时的数据进行计数,第一行是00:00〜09:00,最后一行是21:00〜24:00

我想提及的是,我在StackOverflow上搜索了很多问题,却没有找到答案

SELECT COUNT( * ) , DATE_FORMAT( sms_sent.register_time,  '%H:%i:%s' ) AS SENT_TIME
FROM sms_sent
WHERE sms_sent.sent_by =9998
AND DATE( sms_sent.register_time ) =  '2018-12-27'
GROUP BY HOUR( sms_sent.register_time ) 
LIMIT 0 , 30

那是什么

Sent Time       Sent Count
00:00~09:00     0
09:00~10:00     0
10:00~11:00     0
11:00~12:00     0
12:00~13:00     0
13:00~14:00     0
14:00~15:00     0
15:00~16:00     0
16:00~17:00     0
17:00~18:00     0
18:00~19:00     0
19:00~20:00     0
20:00~21:00     0
21:00~24:00     0

我这次得到的是:

Current Result

1 个答案:

答案 0 :(得分:2)

您需要创建一个hours表,以生成一天中的所有小时数。然后,您可以据此创建您感兴趣的期间,也可以JOIN将其添加到您的SMS数据中,以获取每个期间的SMS计数。此查询应提供您想要的结果:

SELECT CASE WHEN hours.hour < 9 then '00:00-09:00'
            WHEN hours.hour >= 21 then '21:00-24:00'
            ELSE concat(lpad(hours.hour, 2, '0'), ':00-', lpad(hours.hour+1, 2, '0'), ':00')
            END AS period,
       COUNT(ss.register_time) AS `Sent Count`
FROM (SELECT n10.n * 10 + n.n as hour
      FROM (SELECT 0 AS n UNION SELECT 1 UNION SELECT 2) n10
      JOIN (SELECT 0 AS n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
            UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) n
      WHERE n10.n * 10 + n.n < 24) hours
LEFT JOIN sms_sent ss ON HOUR(ss.register_time) = hours.hour AND ss.sent_by = 9998 AND DATE(ss.register_time) = '2018-12-27'
GROUP BY period

输出(用于我创建的演示数据):

period          Sent Count
00:00-09:00     3
09:00-10:00     0
10:00-11:00     0
11:00-12:00     1
12:00-13:00     0
13:00-14:00     0
14:00-15:00     1
15:00-16:00     2
16:00-17:00     0
17:00-18:00     0
18:00-19:00     1
19:00-20:00     0
20:00-21:00     0
21:00-24:00     1

Demo on dbfiddle