SQL面试——简单5步,统计某个月连续登录N天的用户数量

简介: 统计某个月连续登录N天的用户数量

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

第1步:选择12月的记录,根据用户iD和登录日期先去重(一天有多行的情况,只记录1行)

select userID,date(from_unixtime(createdTime)) a_createdTime
from user_active_log
where substr(date(from_unixtime(createdTime)),1,7) = '2021-12' # 知识点1:时间戳转为时间字符串格式然后取前7个字符
group by userId,date(from_unixtime(createdTime)) # 知识点2:根据userId,a_createdTime 去重

第2步:创建辅助列a_rk (每个userID下的日期排序值)

select userID,a_createdTime,row_number() over(partition by userId order by a_createdTime) a_rk # 知识点3:用row_number() 对每个userID下的a_createdTime进行排名
from
(
select userID,date(from_unixtime(createdTime)) a_createdTime
from user_active_log
where substr(from_unixtime(createdTime),1,7) = '2021-12'
group by userId,a_createdTime) t0

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

select *,date_sub(a_createdTime,interval a_rk day ) b_createdTime # 知识点4:date_sub 日期减去数字;datediff 日期减日期
from
(
select userID,a_createdTime,row_number() over(partition by userId order by a_createdTime) a_rk
from
(
select userID,date(from_unixtime(createdTime)) a_createdTime
from user_active_log
where substr(from_unixtime(createdTime),1,7) = '2021-12'
group by userId,a_createdTime) t0 )t1

第4步 根据起步时间列统计连续登录天数

select userId,b_createdTime,count(1) cts
from
(select *,date_sub(a_createdTime,interval a_rk day ) b_createdTime
from
(
select userID,a_createdTime,row_number() over(partition by userId order by a_createdTime) a_rk
from
(
select userID,date(from_unixtime(createdTime)) a_createdTime
from user_active_log
where substr(from_unixtime(createdTime),1,7) = '2021-12'
group by userId,a_createdTime) t0 ) t1 ) t2 group by userId,b_createdTime having count(1)>6 # 知识点5:having 用在groupby后做条件筛选

第5步 根据统计结果查询连续登录人数

select count(distinct userId) num_users
from
(select userId,b_createdTime,count(1) cts
from

(select *,date_sub(a_createdTime,interval a_rk day ) b_createdTime
from
    (
    select userID,a_createdTime,row_number() over(partition by userId order by a_createdTime) a_rk
    from
        (
        select userID,date(from_unixtime(createdTime)) a_createdTime
        from user_active_log
        where substr(from_unixtime(createdTime),1,7) = '2021-12'
        group by userId,a_createdTime
        ) t0
    ) t1
) t2 group by userId,b_createdTime having  count(1)>6

) t3;

目录
相关文章
|
8月前
|
SQL 数据库
SQL面试50题------(初始化工作、建立表格)
这篇文章提供了SQL面试中可能会遇到的50道题目的建表和初始化数据的SQL脚本,包括学生、教师、课程和成绩表的创建及数据插入示例。
SQL面试50题------(初始化工作、建立表格)
|
2月前
|
存储 NoSQL 前端开发
美团面试:手机扫描PC二维码登录,底层原理和完整流程是什么?
45岁老架构师尼恩详细梳理了手机扫码登录的完整流程,帮助大家在面试中脱颖而出。该过程分为三个阶段:待扫描阶段、已扫描待确认阶段和已确认阶段。更多技术圣经系列PDF及详细内容,请关注【技术自由圈】获取。
|
8月前
|
SQL
sql面试50题------(1-10)
这篇文章提供了SQL面试中的前10个问题及其解决方案,包括查询特定条件下的学生信息、教师信息和课程成绩等。
sql面试50题------(1-10)
|
5月前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
5月前
|
存储 缓存 NoSQL
希音面试:亿级用户 日活 月活,如何统计?(史上最强 HyperLogLog 解读)
本文详细介绍了如何使用Redis的各种数据结构(如Set、Bitmap、HyperLogLog)来统计网站的日活(DAU)和月活(MAU)用户数。作者通过实际案例和代码示例,系统地讲解了这些数据结构的原理和应用场景,特别是HyperLogLog在处理亿级用户数据时的优势。文章还深入解析了HyperLogLog的数学原理和底层数据结构,帮助读者更好地理解和应用这一高效的数据统计工具。此外,文章还提供了多个相关面试题和参考资料,适合准备面试的技术人员阅读。
|
5月前
|
SQL
开启慢SQL设置long_query_time=0.1为啥会统计的sql却存在小于100毫秒的sql
开启慢SQL设置long_query_time=0.1为啥会统计的sql却存在小于100毫秒的sql
87 1
|
6月前
|
Kubernetes 架构师 算法
阿里面试:全国14亿人,统计出重名最多的前100个姓名
文章介绍了如何解决“从全国14亿人的数据中统计出重名人数最多的前100位姓名”的面试题,详细分析了多种数据结构的优缺点,最终推荐使用前缀树(Trie)+小顶堆的组合。文章还提供了具体的Java代码实现,并讨论了在内存受限情况下的解决方案,强调了TOP N问题的典型解题思路。最后,鼓励读者通过系统化学习《尼恩Java面试宝典》提升面试技巧。
阿里面试:全国14亿人,统计出重名最多的前100个姓名
|
6月前
|
SQL 存储 关系型数据库
mysql 数据库空间统计sql
mysql 数据库空间统计sql
81 0
|
8月前
|
SQL
sql面试50题------(11-20)
这篇文章提供了SQL面试中的50道题目,其中详细解释了11至20题,包括查询与学号为“01”的学生所学课程相同的学生信息、不及格课程的学生信息、各科成绩统计以及学生的总成绩排名等问题的SQL查询语句。
|
8月前
|
SQL
sql面试50题------(21-30)
这篇文章是SQL面试题的21至30题,涵盖了查询不同老师所教课程的平均分、按分数段统计各科成绩人数、查询学生平均成绩及其名次等问题的SQL查询语句。
sql面试50题------(21-30)

热门文章

最新文章