定义初始化变量:求连续登录xxx天的用户数
程序员文章站
2022-06-24 22:52:46
create database data_2021Q1_tiku;use data_2021Q1_tiku;建表create table login_record (userid int not null,time date default null)engine=innodb default charset=utf8mb4;– drop table login_record;查表SELECT * from login_record;插入数据insert into login_reco...
问题: login_record ( 用户userid和登录时间time)求连续登录3天的用户数
考察:
- 定义变量
- 逻辑构建
- SQL基础查询语句
create database data_2021Q1_tiku;
use data_2021Q1_tiku;
# 建表
create table `login_record` (
`userid` int not null,
`time` date default null
)engine=innodb default charset=utf8mb4;
-- drop table login_record;
# 查表
SELECT * from `login_record`;
# 插入数据
insert into `login_record` values
(1,'2020-04-18'),
(1,'2020-04-19'),
(1,'2020-04-20'),
(1,'2020-04-21'),
(2,'2020-04-16'),
(2,'2020-04-17'),
(2,'2020-04-18'),
(3,'2020-04-18'),
(4,'2020-04-18'),
(5,'2020-04-18'),
(6,'2020-04-18'),
(7,'2020-04-18');
# 业务问题:求连续登录3天的用户数;
-- 理解业务问题:返回用户user_id,以及其登录次数;
-- 梳理数据表:加入这是一张巨量的用户表,我需要明确此表的范围;
select min(time)
,max(time)
from login_record; -- 2020-04-16 到 2020-04-21;
-- 两个临时变量
select
@prev_time := '2000-01-01', -- 上次登录时间
@login_count := 0; -- 登录计数
-- 查询
select wrap.userid, max(wrap.login_count) as max_login_count
from (
-- 计算当前记录是第几次连续登录
select
login_record.*,
if(
abs(datediff(@prev_time, time)) = 1,
@login_count := @login_count + 1,
@login_count := 1
) as login_count,
@prev_time := time as tmp
from login_record
) as wrap
group by wrap.userid
having max(wrap.login_count) >= 3;
-- having max_login_count >= 3 考虑到稳妥起见,还是不建议用别名进行聚合后过滤;
技能思维总结:定义初始化变量的逻辑 + 条件判断的逻辑
eg:编写一个sum_num函数:输入任意一个数n,返回1+2+3+…+n的结果;
def sum_num(n) :
a=0
b=0
while a<=n:
b=a+b
a=a+1
return b
-- from 202010 WeiChen
更多相关案例:敬请期待 ……
本文地址:https://blog.csdn.net/weixin_44976611/article/details/112568958
上一篇: Mysql在线添加索引