MySQL按小时查询数据,没有的补0
需求背景
一个统计接口,前端需要返回两个数组,一个是0-23的小时计数,一个是各小时对应的统计数。
思路 直接使用group by查询要统计的表,当某个小时统计数为0时,会没有该小时分组。思考了一下,需要建立辅助表,只有一列小时,再插入0-23共24个小时
CREATE TABLE hours_list ( hour int NOT NULL PRIMARY KEY )
先查小时表,再做连接需要查的表,即可将没有统计数的小时填充上0。这里由于需要查多个表中,create_time在每个小时区间内、且SOURCE_ID等于查询条件的统计之和,所以UNION ALL了多张表
SELECT
t.HOUR,
sum(t.HOUR_COUNT) hourCount
FROM
(SELECT
hs. HOUR AS HOUR,
COUNT(cs.RECORD_ID) AS HOUR_COUNT
FROM
cbc_hours_list hs
LEFT JOIN cbc_source_0002 cs ON HOUR (cs.create_time) = hs. HOUR
AND cs.create_time > #{startTime}
AND cs.create_time <= #{endTime}
<#if sourceId?exists && sourceId !=''>
AND SOURCE_ID = #{sourceId}
#if>
GROUP BY
hs. HOUR
UNION ALL
SELECT
hs.HOUR AS HOUR,
COUNT(cs.RECORD_ID) AS HOUR_COUNT
FROM
cbc_hours_list hs
LEFT JOIN cbc_source_hs cs ON HOUR (cs.create_time) = hs. HOUR
AND cs.create_time > #{startTime}
AND cs.create_time <= #{endTime}
<#if sourceId?exists && sourceId !=''>
AND SOURCE_ID = #{sourceId}
#if>
GROUP BY
hs. HOUR
UNION ALL
SELECT
hs.HOUR AS HOUR,
COUNT(cs.RECORD_ID) AS HOUR_COUNT
FROM
cbc_hours_list hs
LEFT JOIN cbc_source_kfyj cs ON HOUR (cs.create_time) = hs. HOUR
AND cs.create_time > #{startTime}
AND cs.create_time <= #{endTime}
<#if sourceId?exists && sourceId !=''>
AND SOURCE_ID = #{sourceId}
#if>
GROUP BY
hs. HOUR
UNION ALL
SELECT
hs.HOUR AS HOUR,
COUNT(cs.RECORD_ID) AS HOUR_COUNT
FROM
cbc_hours_list hs
LEFT JOIN cbc_source_his_0002 cs ON HOUR (cs.create_time) = hs. HOUR
AND cs.create_time > #{startTime}
AND cs.create_time <= #{endTime}
<#if sourceId?exists && sourceId !=''>
AND SOURCE_ID = #{sourceId}
#if>
GROUP BY
hs. HOUR
UNION ALL
SELECT
hs.HOUR AS HOUR,
COUNT(cs.RECORD_ID) AS HOUR_COUNT
FROM
cbc_hours_list hs
LEFT JOIN cbc_source_his_hs cs ON HOUR (cs.create_time) = hs. HOUR
AND cs.create_time > #{startTime}
AND cs.create_time <= #{endTime}
<#if sourceId?exists && sourceId !=''>
AND SOURCE_ID = #{sourceId}
#if>
GROUP BY
hs. HOUR
UNION ALL
SELECT
hs.HOUR AS HOUR,
COUNT(cs.RECORD_ID) AS HOUR_COUNT
FROM
cbc_hours_list hs
LEFT JOIN cbc_source_his_kfyj cs ON HOUR (cs.create_time) = hs. HOUR
AND cs.create_time > #{startTime}
AND cs.create_time <= #{endTime}
<#if sourceId?exists && sourceId !=''>
AND SOURCE_ID = #{sourceId}
#if>
GROUP BY
hs. HOUR) t
GROUP BY
t.hour
效果
统计数为0的小时也可以查出来了。

上一篇:Redis和springboot 整合redisUtil类的示例代码
栏 目:其它数据库
本文标题:MySQL按小时查询数据,没有的补0
本文地址:https://zz.feitang.co/shujuku/32509.html
您可能感兴趣的文章
- 12-31hiredis从安装到项目实战操作
- 12-31phpmyadmin登录时怎么指定服务器ip和端口
- 12-31MySQL线上死锁分析实战
- 12-31MySQL 触发器的使用和理解
- 12-31MySQL 字段默认值该如何设置
- 12-31Redis主从同步配置的方法步骤(图文)
- 12-31MySQL 字符串拆分操作(含分隔符的字符串截取)
- 12-31redis 交集、并集、差集的具体使用
- 12-31MySQL精讲之二:DML数据操作语句
- 12-31PostgreSQL判断字符串是否包含目标字符串的多种方法


阅读排行
推荐教程
- 12-07mysql中外链接是什么意思?
- 12-07Redis中的Scan命令的使用详解
- 12-05mysql的事务,隔离级别和锁用法实例分析
- 12-15浅析mysql迁移到clickhouse的5种方法
- 12-08添加mysql的用户名和密码是什么语句?
- 12-23PL/SQL登录Oracle数据库报错ORA-12154:TNS:无法解析指定的连接标识符
- 12-20PhpMyAdmin出现错误数据无法导出怎么办?
- 12-19Redis中实现查找某个值的范围
- 12-23详解Oracle游标的简易用法
- 12-23使用imp和exp命令对Oracle数据库进行导入导出操作详解




