mysql统计一个连续日期天次数

因为有些天可能没有统计数据,所以需要借助一个日期表来补充没有数据的日期

1.生成日期表,借助num临时表

CREATE TABLE num (i int);
INSERT INTO num (i) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);



CREATE TABLE  if not exists tb_calendar (datelist date);  INSERT INTO tb_calendar (datelist) SELECT
    adddate(
        (   
            DATE_FORMAT("2019-1-1", '%Y-%m-%d') 
        ),
        numlist.id
    ) AS `date`
FROM
    (
        SELECT
            n1.i + n10.i * 10 + n100.i * 100 + n1000.i * 1000 AS id
        FROM
            num n1
        CROSS JOIN num AS n10
        CROSS JOIN num AS n100
        CROSS JOIN num AS n1000
    
    ) AS numlist;

2.按实际业务统计数据,这里是统计操作日志里面文件上传,下载,删除操作次数,周期是30天

SELECT
	date( dday ) ddate,
	max( uploadnum ) AS uploadnum,
	max( downloadnum ) AS downloadnum,
	max( deletenum ) AS deletenum 
FROM
	(
	SELECT
		datelist AS dday,
		0 AS uploadnum,
		0 AS downloadnum,
		0 AS deletenum 
	FROM
		tb_calendar 
	WHERE
		DATE_SUB( CURDATE(), INTERVAL 29 DAY ) <= date( datelist ) 
		AND date( datelist )<= CURDATE() UNION ALL
	SELECT
		DATE( invoke_time ) dday,
		count( 1 ) uploadnum,
		0 AS downloadnum,
		0 AS deletenum 
	FROM
		interface_invoke_log 
	WHERE
		invoke_name IN ( 'dfssUploadFile', 'dfssUpload' ) 
		AND response_status = '200' 
		AND DATE_SUB( CURDATE(), INTERVAL 29 DAY ) <= DATE( invoke_time ) 
	GROUP BY
		DATE( invoke_time ) UNION ALL
	SELECT
		DATE( invoke_time ) dday,
		0 uploadnum,
		count( 1 ) AS downloadnum,
		0 AS deletenum 
	FROM
		interface_invoke_log 
	WHERE
		invoke_name IN ( 'dfssDownload', 'dfssDownloadByFileID' ) 
		AND response_status = '200' 
		AND DATE_SUB( CURDATE(), INTERVAL 29 DAY ) <= DATE( invoke_time ) 
	GROUP BY
		DATE( invoke_time ) UNION ALL
	SELECT
		DATE( invoke_time ) dday,
		0 uploadnum,
		0 AS downloadnum,
		count( 1 ) AS deletenum 
	FROM
		interface_invoke_log 
	WHERE
		invoke_name IN ( 'dfssFileDelete', 'fileDeleteByFileID' ) 
		AND response_status = '200' 
		AND DATE_SUB( CURDATE(), INTERVAL 29 DAY ) <= DATE( invoke_time ) 
	GROUP BY
		DATE( invoke_time ) 
	) a 
GROUP BY
	ddate 
ORDER BY
	ddate

3.结果如下

 

### 回答1: 在 MySQL 中,可以使用以下语句来实现统计连续登录的用户: ``` SELECT user_id FROM login_history WHERE login_time BETWEEN DATE_SUB(NOW(), INTERVAL 3 DAY) AND NOW() GROUP BY user_id HAVING COUNT(*) = 3 ``` 这条查询会搜索在过去三内的所有登录记录,然后分组每个用户的登录记录,最后筛选出登录记录数量等于 3 的用户。 假设你有一张名为 `login_history` 的表,其中包含了登录记录,表结构如下: ``` +---------+------------+ | user_id | login_time | +---------+------------+ | 1 | 2021-01-01 | | 1 | 2021-01-02 | | 1 | 2021-01-03 | | 2 | 2021-01-01 | | 2 | 2021-01-02 | | 3 | 2021-01-01 | | 3 | 2021-01-03 | +---------+------------+ ``` 执行上面的查询后,结果为: ``` +---------+ | user_id | +---------+ | 1 | +---------+ ``` 可以看到,用户 1 在过去三内都登录了,所以被选中。其他用户未被选中,是因为他们在过去三内有一没有登录。 ### 回答2: 要实现统计连续登录的用户,可以通过以下步骤: 1. 首先,创建一个包含用户登录信息的表,可以包括用户ID和登录日期字段。例如,创建一个名为 "login_info" 的表,包含 "user_id" 和 "login_date" 字段。 2. 使用MySQL时间函数和日期函数来确保只获取最近三内的登录日期。可以使用CURDATE()获取当前日期,使用DATE_SUB()和INTERVAL来计算三前的日期。在查询语句中,使用WHERE子句来筛选出在这个日期范围内的登录记录。 3. 使用GROUP BY子句按照用户ID进行分组,以便根据用户进行统计。 4. 使用HAVING子句来筛选出连续登录的用户。在这个例子中,使用COUNT(*)函数来计算每个用户的登录次数,然后使用条件语句COUNT(*)=3来筛选出登录次数为3的用户,即连续登录。 以下是一个示例查询语句的示例: SELECT user_id FROM login_info WHERE login_date >= DATE_SUB(CURDATE(), INTERVAL 2 DAY) -- 最近三内的登录日期 GROUP BY user_id HAVING COUNT(*) = 3; -- 登录次数为3即连续登录 这样,就可以通过以上步骤来实现统计连续登录的用户。 ### 回答3: 要实现统计连续登陆的用户,可以使用MySQL数据库日期函数和子查询来实现。 首先,假设用户的登录信息存储在一个表中,包含用户ID(user_id)和登录日期(login_date)两个字段。 可以使用DATE_SUB函数和CURDATE函数结合,查询连续的登录记录。具体的SQL查询语句如下: ``` SELECT user_id FROM login_records WHERE login_date >= DATE_SUB(CURDATE(), INTERVAL 2 DAY) GROUP BY user_id HAVING COUNT(DISTINCT login_date) = 3; ``` 解释一下以上查询语句的步骤: 1. `DATE_SUB(CURDATE(), INTERVAL 2 DAY)`用于获取当前日期的前两日期。 2. `WHERE login_date >= DATE_SUB(CURDATE(), INTERVAL 2 DAY)`筛选出登录日期连续之内的记录。 3. `GROUP BY user_id`按用户ID进行分组。 4. `HAVING COUNT(DISTINCT login_date) = 3`根据分组后的用户ID,统计不重复的登录日期数量为3。 以上查询语句会返回所有连续登陆的用户的ID列表。 需要注意的是,以上的查询语句只能统计连续登录的用户,如果要统计连续N登录的用户,只需将查询语句中的数字2改为N-1即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值