当前位置: 首页 > news >正文

ipad 建网站网站建设如何销售

ipad 建网站,网站建设如何销售,无锡响应式网站制作,关键词优化排名费用SQL:连续登录类型问题前言1.数据准备阶段2.查看数据问题数据处理方法一:适用于短期(3天)的方法方法二:适用于求最长连续登录天数类型方法三:适用于知道指定天数总结前言 连续登录、连续上场问题是SQL笔试面试中高频问题之一&…

SQL:连续登录类型问题

  • 前言
  • 1.数据准备阶段
  • 2.查看数据
  • 问题
    • 数据处理
    • 方法一:适用于短期(3天)的方法
    • 方法二:适用于求最长连续登录天数类型
    • 方法三:适用于知道指定天数
  • 总结

前言

连续登录、连续上场问题是SQL笔试面试中高频问题之一,这里提供解决此类问题的3个思路。
思路来源:SQL连续登录问题-托尼老师

1.数据准备阶段

使用以下语句进行数据的建表和数据插入

# 创建初始表
drop table if exists  `register_tb` ;
CREATE TABLE `register_tb` (
`user_id` int(11) NOT NULL,
`reg_time` datetime NOT NULL,
`reg_port` varchar(8) NOT NULL,
PRIMARY KEY (`user_id`));
INSERT INTO register_tb VALUES(1101,'2022-02-08 07:23:15','pc');
INSERT INTO register_tb VALUES(1102,'2022-02-08 09:12:22','app');
INSERT INTO register_tb VALUES(1103,'2022-02-08 09:35:45','m');
INSERT INTO register_tb VALUES(1104,'2022-02-08 09:41:01','app');
INSERT INTO register_tb VALUES(1105,'2022-02-08 12:01:01','app');
INSERT INTO register_tb VALUES(1106,'2022-02-08 17:22:13','app');
INSERT INTO register_tb VALUES(1107,'2022-02-08 18:26:21','pc');
INSERT INTO register_tb VALUES(1108,'2022-02-08 19:16:21','pc');
INSERT INTO register_tb VALUES(1109,'2022-02-08 19:56:21','pc');drop table if exists  `login_tb` ;
CREATE TABLE `login_tb` (
`log_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`log_time` datetime NOT NULL,
`log_port` varchar(8) NOT NULL,
PRIMARY KEY (`log_id`));
INSERT INTO login_tb VALUES(101,1101,'2022-02-09 07:24:15','pc');
INSERT INTO login_tb VALUES(102,1102,'2022-02-09 09:12:57','app');
INSERT INTO login_tb VALUES(103,1003,'2022-02-09 09:36:11','m');
INSERT INTO login_tb VALUES(104,1102,'2022-02-10 09:37:01','app');
INSERT INTO login_tb VALUES(105,1104,'2022-02-10 12:01:46','app');
INSERT INTO login_tb VALUES(106,1106,'2022-02-10 10:23:01','app');
INSERT INTO login_tb VALUES(107,1003,'2022-02-10 10:43:01','m');
INSERT INTO login_tb VALUES(108,1102,'2022-02-11 11:56:47','app');
INSERT INTO login_tb VALUES(109,1104,'2022-02-11 14:52:37','app');
INSERT INTO login_tb VALUES(1010,1106,'2022-02-11 16:56:27','app');
INSERT INTO login_tb VALUES(1011,1003,'2022-02-11 17:43:01','m');
INSERT INTO login_tb VALUES(1012,1106,'2022-02-12 10:56:17','app');

register_tb表,即用户注册表:

字段含义示例
user_id用户ID1101
reg_time注册时间2022-02-08 09:12:22
reg_port注册端口‘app’

login_tb表:即用户登录表:

字段含义示例
log_id登录ID1,2,3···
user_id用户ID1101
log_time登录时间2022-02-08 09:12:22
log_port登录端口‘app’

2.查看数据

# 查询登录信息
select*
from login_tb;

数据如下:
在这里插入图片描述
查询新用户注册信息

select*
from login_tb;

数据如下:
在这里插入图片描述

问题

查询连续登录不小于3天的新用户的user_id。

数据处理

因为一个用户一天可能登录多次,所以需要先对登录表进行去重。

selectdistinctuser_id,date(log_time)
from login_tb
order by user_id;

在这里插入图片描述

方法一:适用于短期(3天)的方法

datediff(day1,day2)   -- 或者使用timestampdiff(day,day1,day2) 计算两个日期的相差天数   

由于只需要查出连续登录三天的用户ID,所以可以连续进行连接,且连接的时候限制第二次连接的时间比原时间加1天,第三次连接比第二次连接的时间加1天。

with t1 as(selectdistinctuser_id,date(log_time) ymdfrom login_tborder by user_id
)
selectt1.user_id,t1.ymd,t2.ymd,t3.ymd
from t1
join t1 t2
on t1.user_id=t2.user_idand datediff(t2.ymd,t1.ymd)=1  # 连续登录2天
join t1 t3
on t2.user_id=t3.user_idand datediff(t3.ymd,t2.ymd)=1

在这里插入图片描述
所以在登录表中一共有3个用户连续登录3天。但是题干要求是新用户,所以还需要进行过滤。

with t1 as(selectdistinctuser_id,date(log_time) ymdfrom login_tborder by user_id
)
selectt1.user_id
from t1
join t1 t2
on t1.user_id=t2.user_idand datediff(t2.ymd,t1.ymd)=1  # 连续登录2天
join t1 t3
on t2.user_id=t3.user_idand datediff(t3.ymd,t2.ymd)=1 # 连续登录3天
where t1.user_id in (selectuser_idfrom register_tb)

结果如下,所以只有1102和1106两位新用户连续登录次数超过三天
在这里插入图片描述

方法二:适用于求最长连续登录天数类型

前面的思路适用于较少的天数登录,如果求连续登录15天的用户,那么上面的表需要join 15次,太繁琐。
可以使用窗口函数row_number()进行解决。思路如下:
先对处理的数据,按照用户进行分组排序,这里使用row_number即可

with t1 as(selectdistinctuser_id,date(log_time) ymdfrom login_tborder by user_id
)
select*,row_number() over (partition by user_id order by ymd) as num
from t1

在这里插入图片描述

接下来可以使用ymd减去对应的时间,然后统计相同的日期,例如对于1003用户,2022-02-09减去1天为2022-02-08,然后2022-02-10 减去2天为2022-02-08,2022-02-11减去3天为2022-02-08,三个结果均为2022-02-08,所以再对这个结果进行聚合即可。如果1003还有一个数据,是2022-02-14,num为4,那2022-02-14减去4天,为2022-02-10,和前面不同,这个时候就不会进行计入

with t1 as(selectdistinctuser_id,date(log_time) ymdfrom login_tborder by user_id
),
t2 as(select*,row_number() over (partition by user_id order by ymd) as numfrom t1
)
select*,date_sub(ymd,interval num day) as init_day
from t2

在这里插入图片描述
接下来只需要按照user_id和init_day进行聚合,查询天数不小于3天且在新人注册表内的用户ID即可。

with t1 as(selectdistinctuser_id,date(log_time) ymdfrom login_tborder by user_id
),
t2 as(select*,row_number() over (partition by user_id order by ymd) as numfrom t1
),
t3 as(select*,date_sub(ymd,interval num day) as init_dayfrom t2
)
selectuser_id
from t3
where user_id in (selectdistinctuser_idfrom register_tb)
group by user_id,init_day
having count(*)>=3  

在这里插入图片描述

方法三:适用于知道指定天数

使用窗口函数lag()进行处理,lag(字段,n)可以把对应的字段向下延展n行

with t1 as(selectdistinctuser_id,date(log_time) ymdfrom login_tborder by user_id
)
select*,lag(ymd,2) over(partition by user_id order by ymd) llday
from t1

在这里插入图片描述
然后只需要筛选出来新用户内,上上次登录日期间隔两天即可。

with t1 as(selectdistinctuser_id,date(log_time) ymdfrom login_tborder by user_id
),
t2 as(select*,lag(ymd,2) over(partition by user_id order by ymd) lldayfrom t1
)
selectuser_id
from t2
where datediff(ymd,llday) = 2and user_id in (selectdistinctuser_idfrom register_tb);

在这里插入图片描述

总结

本文一共介绍三种方法求连续登录问题,下面对其使用场景进行说明

方法适用场景
join自连接+datediff()适用于短期的连续登录天数,一般3天。多天数使用的话join连接条件太复杂,且性能低
row_number()+date_sub()适用求最大连续登录天数,但是加上限制条件也可以求指定天数
lag()+datediff()适用求指定天数的连续登录问题,如10天,修改lag和datediff结果即可完成
http://www.dtcms.com/a/441013.html

相关文章:

  • 苏州园区网站制作公司工业软件界面设计
  • 设计理论网站城乡建设部网站首页上海
  • 承德网站设计公司wordpress默认主题
  • 网站开发公司有什么福利网站建设与管理课程标准
  • 一个网站里有两个网页怎么做wordpress怎么提速
  • 新闻类网站的设计html网页设计规则代码
  • 新乡专业做淘宝网站怎么找网站做推广
  • 域名跟空间都有了怎么做网站网站建设运行工作情况总结
  • 做自己的免费网站上海公司注册网上查询
  • 唐山网站建设方案策划网站建设优化服务特色
  • net域名 著名网站wordpress简体中文下载地址
  • 东莞效果好的营销型网站建设小零件加工在家做
  • 网站开发+接活校园类网站建设
  • 网站建设简单外国网站签到做任务每月挣钱
  • wordpress评分管理长沙seo行者seo09
  • 杭州高端设计网站建设网站及推广
  • 哪些网站做的比较好网站建设意见建议
  • 搬瓦工做网站稳定吗个人开发者
  • 企业门户网站的意义专做热血电影的网站
  • 洛阳霞光企业网站建设公司专业的餐饮加盟网站建设
  • 网站制作关键字排名网站怎么做有创意
  • 温州免费做网站网站开发人员 怎么保存
  • 移动端网站开发公司网页制作流程
  • 莒县网站制作公司怎样将建设银行网站加入可信站
  • 建设产品网站课程wordpress 页面标签
  • 网站建设制作深圳湘潭seo优化
  • 最简单的做网站工具优度公司做的网站
  • 静态网站 后台公众号平台登录入口官网
  • 论述电子商务网站建设的流程阿里云 网站
  • 建设银行成都官网招聘网站怎么把网站上传到域名