(四)SQL面试题(连续登录、近N日留存)学习简要笔记 #CDA学习打卡

ops/2024/10/25 8:26:30/

目录

一. 连续登录N天的用户数量

1)举例题目

2)分析思路

3)解题步骤

(a)Step1:选择12月的记录,并根据用户ID和登录日期先去重

(b)Step2:创建辅助列a_rk(每个userID下的日期排序值)

(c)Step3:创建辅助列起步时间b_createdTime(用登录日期减去排序值,得到新时间列

(d)Step4:根据起步时间列统计连续登录天数

(e)Step5:根据统计结果查询连续登录人数(题目要求连续7天)

二. 近N日留存的用户数及留存率

1)举例题目

2)分析思路

3)解题步骤

(a)Step1:根据用户id和登录日期先去重

(b)Step2:创建新列first_time,获取每个userID下的最早登录日期

(c)Step3:创建辅助列delta_time,用登录日期列减去最早登录日期first_time,得到留存天数

(d)Step4:按first_time列统计不同留存天数对应的次数和即某日的近N日留存数

(e)Step5:用某日的近N日留存数除以首日登录人数即留存率


一. 连续登录N天的用户数量

1)举例题目

现有用户登录表(user_active_Iog)一份,里面有2个字段:userlD(用户ID),createdTime(登录时间
戳),需要统计2021年12月连续登录7天的用户数量。

2)分析思路

题目要求的核心是连续登录,那么我们思考,何为连续登录呢? 顾名思义,连续登录就是指登录的日期连续,那么用数据库的语言来表达的话,我们该描述表达日期连续呢? 我们简化一下数据来考虑这个问题,一般我们有2个办法:

方法A:构造一个连续数字构成的辅助列,用原始日期减去辅助列的数字,得到一个新日期,根据这个新日期来判断是否连续。

方法2:构造一个连续日期构成的辅助列,用原始日期减去这个辅助列的日期,得到一个新数字,最后根据这个数字来判断连续。 

一般我们为了方便统计某一起始时间连续登录了多少天,多半采用方案A。

3)解题步骤

我们接着看,刚才知道了如何在SQL里面如何描述连续登录,接下来我们逐步按照题目要求拆解即可:

(a)Step1:选择12月的记录,并根据用户ID和登录日期先去重

(注:单个用户一天有多行登录数据的情况,只保留1行)

运行结果如下:

(b)Step2:创建辅助列a_rk(每个userID下的日期排序值)

运行结果如下:

(c)Step3:创建辅助列起步时间b_createdTime(用登录日期减去排序值,得到新时间列

运行结果如下:

(d)Step4:根据起步时间列统计连续登录天数

运行结果如下:

(e)Step5:根据统计结果查询连续登录人数(题目要求连续7天)

运行结果如下:

二. 近N日留存的用户数及留存率

1)举例题目

现有用户登录表(user_active log)一份,里面有2个字段:userID(用户ID),createdTime(登录时间 戳),需要统计近1、2、3、5、7、30日留存用户数量及留存率。

2)分析思路

题目要求的核心是近N日留存,那么我们思考,何为近N日留存呢?顾名思义,就是指距离某个日期的间隔为N,那么用数据库的语言来表达的话,我们该描述表达近N日留存呢?

我们简化一下数据来考虑这个问题:构造一个起始日期构成的辅助列,用原始日期减去辅助列的日期,得到一个新数字N,根据这个新数字,结合起始日期来判断某个日期的近N日留存。

3)解题步骤

(a)Step1:根据用户id和登录日期先去重

运行结果如下:

(b)Step2:创建新列first_time,获取每个userID下的最早登录日期

运行结果如下:

(c)Step3:创建辅助列delta_time,用登录日期列减去最早登录日期first_time,得到留存天数

运行结果如下:

(d)Step4:按first_time列统计不同留存天数对应的次数和即某日的近N日留存数

运行结果如下:

(e)Step5:用某日的近N日留存数除以首日登录人数即留存率

运行结果如下:

Bye!


http://www.ppmy.cn/ops/8384.html

相关文章

STM32 HAL库F103系列之ADC实验(二)

多通道ADC采集(DMA读取)实验 这个实验与单通道ADC(DMA读取)实验大致相同 实验简要: 1,功能描述 通过DMA读取数据 通过ADC1通道0/1/2/3/4/5(PA0/1/2/3/4/5)采集测试电压&#xf…

python 判断变量是数字型还是字符型

python如何判断数据类型?方法如下: 使用type()函数: import types type(x) is types.IntType # 判断是否int 类型 type(x) is types.StringType #是否string类型可以不用记住types.StringType,即: import types type(…

MySQL基础篇总结

参考:黑马程序员MySQL基础视频链接 数据库基本操作 启动与停止 1.第一种方式: 1>以管理员身份运行cmd 2>在命令行窗口中输入: 启动:net start mysql80停止:net stop mysql80 2.第二种方式: 1>WinR快捷方式打开如下: 输入&#…

C++修炼之路之list--C++中的双向循环链表

目录 前言 一:正式之前先回顾数据结构中的双向循环链表 二:list的简介 三:STL中list常用接口函数的介绍及使用 1.构造函数接口 2.list迭代器 范围for 3.数据的修改接口函数 4.list容量操作函数 5.list的迭代器失效 6.演示代码和测…

Stable Diffusion UI 从安装到实现文字图片融合(光影字,错觉图)图片制作详细教程

前言 最近在实践大模型本地部署,前几天在本地部署了一个ChatGLM大模型,刚好环境搭好了,也支持跑Stable Diffusion,所以就安装了再尝试一下。 原因是之前在B站上有大佬做了一个Windows电脑能一键运行的Stable Diffusion的安装包&…

【机器学习】小波变换在特征提取中的实践与应用

小波变换在特征提取中的实践与应用 一、小波变换的基本原理与数学表达二、基于小波变换的特征提取方法与实例三、小波变换在特征提取中的优势与展望 在信号处理与数据分析领域,小波变换作为一种强大的数学工具,其多尺度分析特性使得它在特征提取中扮演着…

排序算法之堆排序

目录 一、简介二、代码实现三、应用场景 一、简介 算法平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度排序方式稳定性堆排序O( N N N log ⁡ 2 N \log_{2}N log2​N))O( N N N log ⁡ 2 N \log_{2}N log2​N))O( N N N log ⁡ 2 N \log_{2}N log2​N))O(1)In-place不稳…

Qt-控件篇

QPushbutton 1、设置按钮文本 pushButton->setText("按钮"); 2、获取按钮文本 pushButton->text(); 3、设置按钮的大小为特定值(宽度和高度) pushButton->setFixedSize(width,height); 4、设置按钮悬停时的工具提示文本。 pushButto…