如何用GROUPBY子句为小时编写mysql查询,如果某个小时没有数据,则返回0

2izufjch  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(249)

我想写mysql查询来获取数据,我想按小时计算每小时发送的短信,如果某个小时没有数据,它应该返回0。
另外,我想把前9个小时和后3个小时的数据一起计算,就像我在预期结果中提到的,第一行是00:00~09:00,最后一行是21:00~24:00
我想说的是,我找了很多问题,没有找到答案

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

这次我得到的是:

bkkx9g8r

bkkx9g8r1#

你需要创建一个 hours 表,以生成一天中的所有小时。然后你就可以从中创造出你感兴趣的时期 JOIN 它会添加到您的短信数据中,以获取每个时段的短信数。此查询应提供所需的结果:

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

在dbfiddle上演示

相关问题