我想编写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
我这次得到的是:
答案 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