用户登录
用户注册

分享至

定义初始化变量:求连续登录xxx天的用户数

  • 作者: 这尼玛美女裸图极品
  • 来源: 51数据库
  • 2021-08-12

问题: 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 

更多相关案例:敬请期待 ……

软件
前端设计
程序设计
Java相关