欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

定义初始化变量:求连续登录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 

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

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

本文地址:https://blog.csdn.net/weixin_44976611/article/details/112568958