mysql 计算出本周内和上周内,近7天内 用户连续登录天数
mysql 计算出本周内和上周内,近7天内 用户连续登录天数
数据源示例:

建表语句:
CREATE TABLE `user_login` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`name` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '人名',
`login_date` datetime DEFAULT NULL COMMENT '登录日期',
PRIMARY KEY (`id`)
)
;
插入数据:
insert into user_login (name,login_date)
values
('A','2023-07-19 10:00:00'),
('A','2023-07-19 09:00:00'),
('A','2023-07-18 08:00:00'),
('A','2023-07-17 06:00:00'),
('A','2023-07-16 08:00:00'),
('A','2023-07-15 06:00:00'),
('A','2023-07-14 08:00:00'),
('A','2023-07-13 06:00:00'),
('A','2023-07-10 08:00:00'),
('A','2023-07-09 06:00:00'),
('B','2023-07-18 08:00:00'),
('B','2023-07-17 06:00:00'),
('B','2023-07-16 08:00:00'),
('C','2023-07-15 06:00:00'),
('C','2023-07-14 08:00:00'),
('C','2023-07-13 06:00:00'),
('C','2023-07-12 08:00:00'),
('C','2023-07-11 06:00:00'),
('A','2023-05-18 08:00:00'),
('A','2023-05-17 06:00:00'),
('A','2023-05-16 08:00:00'),
('A','2023-05-15 06:00:00'),
('A','2023-05-14 08:00:00'),
('A','2023-05-13 06:00:00'),
('A','2023-05-10 08:00:00'),
('A','2023-05-09 06:00:00'),
('B','2023-05-18 08:00:00'),
('B','2023-05-17 06:00:00'),
('B','2023-05-16 08:00:00'),
('C','2023-05-15 06:00:00'),
('C','2023-05-14 08:00:00'),
('C','2023-05-13 06:00:00'),
('C','2023-05-12 08:00:00'),
('C','2023-05-11 06:00:00'),
('A','2023-07-20 08:00:00'),
('A','2023-08-12 08:00:00'),
('A','2023-08-11 08:00:00'),
('A','2023-08-18 08:00:00'),
('A','2023-08-17 06:00:00'),
('A','2023-08-16 08:00:00'),
('A','2023-08-15 06:00:00'),
('A','2023-08-14 08:00:00'),
('A','2023-08-13 06:00:00'),
('A','2023-08-10 08:00:00'),
('A','2023-08-09 06:00:00'),
('B','2023-08-18 08:00:00'),
('B','2023-08-17 06:00:00'),
('B','2023-08-16 08:00:00'),
('C','2023-08-15 06:00:00'),
('C','2023-08-14 08:00:00'),
('C','2023-08-13 06:00:00'),
('C','2023-08-12 08:00:00'),
('C','2023-08-11 06:00:00')
;

1 计算本周内,连续4天登录的用户
备注:如果是连续登录N天,则将 having count(diff)>3 ,修改成having count(diff)>N即可
select name,count(diff) as "本周用户连续登录天数"
from
(select *,date_sub(new_login_date , interval date_rank DAY ) as diff
from
(select *,date(login_date) as new_login_date,
dense_rank ()over (partition by name order by login_date) as date_rank
from
(select *,DATE(subdate(curdate()-1,date_format(curdate()-1,'%w')-1)) as a1,
DATE(subdate(curdate()-1,date_format(curdate()-1,'%w')-7)) as a2
from user_login)t1
where login_date >a1 and login_date <a2)t2)t3
group by name
having count(diff)>3
输出结果表:

2 计算上周内,连续4天登录的用户
select name,count(diff) as "上周用户连续登录天数"
from
(select *,date_sub(new_login_date , interval date_rank DAY ) as diff
from
(select *,date(login_date) as new_login_date,
dense_rank ()over (partition by name order by login_date) as date_rank
from
(select *,DATE(subdate(curdate()-1,date_format(curdate()-1,'%w')+6)) as a1,
DATE(subdate(curdate()-1,date_format(curdate()-1,'%w')+0)) as a2
from user_login)t1
where login_date >a1 and login_date <a2)t2)t3
group by name
having count(diff)>3
;
输出结果表:


3 计算过去7天用户连续登录天数
select name,count(diff) as '用户近7天连续登录天数'
from
(select * ,date_sub(new_login_date , interval date_rank DAY) as diff
from
(select *,
dense_rank () over (partition by name order by login_date) as date_rank
from
(select *,date(login_date) as new_login_date
from user_login
where login_date >= curdate() - interval 7 DAY)t1)t2)t3
group by name
输出结果表

注意:
sql中函数计算的当下日期为2023-08-16,在其他日期情况下执行,本周和上周用户连续登录天数,输出结果不同。
情况一:提取上周日到本周六的数据
select * from 表名称 where DATE_SUB(CURDATE(), INTERVAL 6 DAY) <= date(表内时间字段);
情况二:提取本周一到本周日的数据
select* from 表名 where 时间字段名 between DATE(subdate(curdate()-1,date_format(curdate()-1,'%w')-1)) and DATE(subdate(curdate()-1,date_format(curdate()-1,'%w')-7))
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)