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

多表查询就应该用到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
		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
		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
		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
	  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
	  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
运营一个需求,要查询一些数据,每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 ... SELECT COUNT(log_id) AS u_count FROM logdb.`log` GROUP BY TIMESTAMP-TIMESTAMP%(1*60) 其中timestamp 是数据库时间字段。 括号中的1 是间隔时间,1分钟。 如果是1小时,就写60,如果是30s 就写0.5 那被分组的id 如何解决呢?分完组我们还需要 哪些记录被分到哪些组了。 我们可以这么做。 SELECT COUNT(log_id) AS u_count ,GROUP_CONCAT this is incompatible with sql_mode=only_full_group_by 那么在此执行这两句 select @@global.sql_mode; set sql_mode = (SELECT REPLACE(@@sql_mode, ‘ONLY_FULL_GROUP_BY’, ‘’)); %y:表示显示两位的年份 %m:表示月份 %d:表示天数 这样就可以了。DATE_FORMAT() select DATE_FORMAT(create_time,’%Y%u’) weeks,count(caseid) count from tc_case group by weeks; select DATE_FORMAT(create_time,’%Y%m’) months,count(caseid) count from tc_case group by months;
mysql按天,小时,半小时,N分钟,分钟进行数据分组统计mysql不同时间粒度下的分组统计按天统计按小时统计按半小时统计按N分钟统计按分钟统计 mysql不同时间粒度下的分组统计 我们在做项目或者数据分析时,经常遇到这样的需求:统计不同时间粒度下的数据分布情况,例如,每一天中每个小时网站的访问量,某路口每半个小时通过的车辆数量等。对于此类的问题,一个sql简单的查询就能实现,故特此记录下,方便以...
SELECT DATE_FORMAT( order_created_at, ‘%Y-%m-%d %h’ ) AS orderCreatedAt, business_mail_status AS businessMailStatus, count(*) AS subscribeErrorCount t_order WHERE ( order_created_at >= ‘2021-12-05 17:00:00.0’ AND order_created_at <= ‘2021-12-18
要实现这样一个功能 select count(1),小时 from user where createDate=今天 group by 每小时 原本以为很简单的一个聚合很容易找到相关资料,没想到花了好几个小时 首先建一个测试的index和type,分别为ksearch_test和user, 建立mapping http://ip:port/ksearch_test/user...
今天刚好是碰到一个报表需求,要求根据时段统计各工单的数量。这个就有点皮实了,以前都没搞过这玩意。于是研究了几下。 二、准备开始 首先一个问题,想根据时间段进行统计,这个问题先不考虑,先考虑,如果按照一小时统计呢,该怎么去做,于是就一顿操作,写出以下sql,这个基本的相信没什么难度,主要是说,怎么去单独拿到小时,这里用到“DATE_FORMAT”函数。 SELECT DATE_FORMAT( create_order_time, '%H' ) AS h, COUNT( 1 )