锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. 数据库
  4. MYSQL按时间段(按小时分组)分组查询当天小时内数据

MYSQL按时间段(按小时分组)分组查询当天小时内数据

0
  • 数据库
  • 发布于 2024-09-25
  • 0 次阅读
黄健
黄健

运营一个需求,要查询一些数据,每1小时一次的数据 ,Excel表格如下:

第一肯定要是用 GROUP BY 然后

一、单表

SELECT
    DATE_FORMAT( create_time, '%Y-%m-%d %H' ) as time,
    COUNT( DISTINCT member_id) as count 
FROM
    tmp_wp_table 
GROUP BY
    time 
ORDER BY
    time

结果:

二、多表

多表查询就应该用到union连接, 这里根据需求选择 union 还是 union all 注意union 和 union all 的区别

SELECT DATE_FORMAT(x.fenDate, '%Y-%m-%d %H' ) as time, count(DISTINCT x.member_id) as count
    FROM(
    SELECT DISTINCT b.user_id, FROM_UNIXTIME(b.intime) as fenDate
    FROM
        wp_table_pay_1 b 
    WHERE
        b.pay1_status = 1 
        AND b.remarks IS NULL 
        AND FROM_UNIXTIME( b.intime )>'2019-06-27' AND FROM_UNIXTIME( b.intime )<'2019-06-28' UNION ALL

    SELECT DISTINCT b.user_id, b.date as fenDate
    FROM
        wp_table_pay_2 b 
    WHERE
        b.pay2_status = 1 
        AND b.remarks IS NULL  
        AND b.date>'2019-06-27' AND b.date<'2019-06-28' UNION ALL

    SELECT DISTINCT b.user_id , b.create_time as fenDate
    FROM
        wp_table_pay_3 b 
    WHERE
        b.pay3_status = 1 
    AND b.remarks IS NULL 
    AND b.create_time>'2019-06-27' AND b.create_time<'2019-06-28' 

    ) x GROUP BY time  ORDER BY time asc

查询结果:

如果有更好的处理方式。欢迎评论留言进行交流。

补充:这样查出来的结果如果是null,就不会显示在结果集列表中

解决思路

  1. 思路一: 可以在自己的程序中做额外的补零处理
  2. 思路二:可以自己新建时间列表,把未来10年的日期放进去,然后再跟统计表作连接查询
  3. 思路三:构建一个最近一天(或几天)的结果集,然后和查询的结果集合做left join(本文采用思路三的方式)
select a.time,b.count as count
from (
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 1 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 2 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 3 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 4 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 5 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 6 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 7 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 8 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 9 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 10 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 11 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 12 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 13 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 14 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 15 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 16 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 17 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 18 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 19 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 20 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 21 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 22 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 23 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 24 HOUR), '%Y-%m-%d %H' ) as time
) a left join (
    SELECT
      DATE_FORMAT( create_time, '%Y-%m-%d %H' ) as time,
      COUNT( DISTINCT member_id) as count
  FROM
      tmp_wp_table 
  WHERE create_time>'2019-11-20' and create_time<'2019-11-20 23:59:59'
  GROUP BY time
) b on a.time = b.time ORDER BY a.time;

这样查询的结果为空, 需要把NULL设置为0,这时我们可以利用ifnull函数

select a.time,ifnull(b.count,0) as count
from (
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 1 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 2 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 3 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 4 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 5 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 6 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 7 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 8 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 9 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 10 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 11 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 12 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 13 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 14 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 15 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 16 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 17 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 18 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 19 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 20 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 21 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 22 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 23 HOUR), '%Y-%m-%d %H' ) as time union all
    SELECT DATE_FORMAT(date_sub(DATE('2019-11-21'), interval 24 HOUR), '%Y-%m-%d %H' ) as time
) a left join (
    SELECT
      DATE_FORMAT( create_time, '%Y-%m-%d %H' ) as time,
      COUNT( DISTINCT member_id) as count
  FROM
      tmp_wp_table
  WHERE create_time>'2019-11-20' and create_time<'2019-11-20 23:59:59'
  GROUP BY time
) b on a.time = b.time ORDER BY a.time;

查询结果:

这时构建7天的结果集

    SELECT curdate() as click_date
    union all
    SELECT date_sub(curdate(), interval 1 day) as click_date
    union all
    SELECT date_sub(curdate(), interval 2 day) as click_date
    union all
    SELECT date_sub(curdate(), interval 3 day) as click_date
    union all
    SELECT date_sub(curdate(), interval 4 day) as click_date
    union all
    SELECT date_sub(curdate(), interval 5 day) as click_date
    union all
    SELECT date_sub(curdate(), interval 6 day) as click_date


原文链接: https://onlyou.blog.csdn.net//article/details/93980085

标签: #MySQL 49 #数据库 67 #SQL 17
相关文章

深入理解MySQL InnoDB中的B+索引机制 2024-09-30 14:41

目录 一、InnoDB中的B+ 树索引介绍 二、聚簇索引 (一)使用记录主键值的大小进行排序

mysql中B+树的数据存储 2024-09-29 16:36

B+树索引基础分析 B+树 的定义 B+树是一种自平衡的树形数据结构,常用于数据库和操作系统的索引结构。它具有以下特点: 所有数据都存储在叶子节点,非叶子节点仅存储键值和子节点的指针。 叶子节点之间通过指针相互连接,形成一个有序链表,便于范围查询。 每个节点可以拥有多个键值,键值之间是有序的。 B+

MySQl索引事务(B树) 2024-09-29 16:36

目标: 索引 事务 1.索引 1.1概念 索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。 1.2作用 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。 索引所起的作用类似书籍

MySQL数据库的备份与恢复 2024-09-26 17:57

MySQL数据库的备份与恢复 在现代信息时代,数据已成为企业和个人的重要资产,数据的安全性和可恢复性直接影响到业务的连续性和稳定性。MySQL作为广泛使用的关系型数据库管理系统,其数据的备份与恢复显得尤为重要。本文将详细探讨MySQL数据库的备份与恢复策略,包括备份的重要性、备份类型、常用备份方法及

MySQL中创建数据库和表 2024-09-26 17:57

在MySQL中创建数据库和表是数据库管理的基础步骤,它们构成了数据存储和操作的基础结构。下面,我将详细介绍如何在MySQL中创建数据库和表,包括创建数据库的基本语法、设计表的考虑因素、表的创建过程、数据类型和约束的使用等,力求内容详尽且不少于2000字。 一、创建数据库 在MySQL中,数据库是一个

MySQL数据库主从搭建(详细图文) 2024-09-28 15:11

MySQL数据库主从搭建(详细图文) 前言 主从原理: MySQL之间数据复制的基础是二进制日志文件(binary log file)。一台MySQL数据库一旦启用二进制日志后,其作为master,它的数据库中所有操作都会以"事件"的方式记录在二进制日志中,其他数据库作为slave通过一个I/O线程

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.