SQL面试题每日一题之求解用户最长连续登录天数

SQL面试题每日一题之求解用户最长连续登录天数

之后会不定期更新每日一题sql系列。

SQL面试题每日一题系列内容均来自于网络以及实际使用情况收集,如与各大厂面试题有雷同,纯属巧合。

1.题目

问题:以下为多个用户每日登录记录数据,求解每个用户最长连续登录天数。

该问题为此还会衍生出,标记处连续登录n天用户。用户连续登录中出现的所有未登录日期等。具体之后进行分析计算演示,欢迎持续关注。

2.基础数据准备

create table if not exists temp.user_login_log (
  `id` bigint comment '用户id',
  `login_date` string comment '登录日期'
) comment '用户每日登录流水'

数据预览

idlogin_date
12024-04-25
12024-04-26
12024-04-27
12024-04-28
12024-04-30
12024-05-01
12024-05-02
12024-05-04
12024-05-05
12024-05-06
12024-05-07
22024-04-25
22024-04-28
22024-05-01
22024-05-03
22024-05-04

3.问题分析

求解每个用户最长连续登录天数,考察的是对日期加减函数的使用以及对排序开窗函数的应用。排序开窗函数详见SQL窗口分析函数使用详解系列二之分组排序窗口函数

维度评分
题目难度⭐️⭐️⭐️⭐️
题目清晰度⭐️⭐️⭐️⭐️
业务常见度⭐️⭐️⭐️⭐️⭐️

4.解题SQL

1.对原始数据排序生成序号

这步很重要,作为判断是否连续的基础数据处理。

select id,login_date
	,row_number() over(partition by id order by login_date) as rank_id 
from temp.user_login_log
order by id,login_date

数据结果

idlogin_daterank_id
12024-04-251
12024-04-262
12024-04-273
12024-04-284
12024-04-305
12024-05-016
12024-05-027
12024-05-048
12024-05-059
12024-05-0610
12024-05-0711
22024-04-251
22024-04-282
22024-05-013
22024-05-034
22024-05-045

可以看到这里是按用户id分组,按日期进行了一个分别排序。

2.对排序进行做差值

因为如果是连续登录,那登录日期减去自增的排序就会始终是一个日期值。比如3号登录排序1,4号登录排序2,5号登录排序3。则他们之间的差值都是2。这就是连续。反之,如果差值不一致,就是不连续。

select id,login_date,date_sub(login_date,rank_id) as date_gap 
from (
	select id,login_date
  	,row_number() over(partition by id order by login_date) as rank_id 
  from temp.user_login_log
) a
order by id,login_date

数据结果

idlogin_datedate_gap
12024-04-252024-04-24
12024-04-262024-04-24
12024-04-272024-04-24
12024-04-282024-04-24
12024-04-302024-04-25
12024-05-012024-04-25
12024-05-022024-04-25
12024-05-042024-04-26
12024-05-052024-04-26
12024-05-062024-04-26
12024-05-072024-04-26
22024-04-252024-04-24
22024-04-282024-04-26
22024-05-012024-04-28
22024-05-032024-04-29
22024-05-042024-04-29

可以看到连续登录的日期的记录其求解的date_gap是相同的,这时候大多人都能反应过来,求解最长连续登录天数,接下来只要按date_gap分组计数,然后求个最大值就可以了。

3.按date_gap分组计数

select id,date_gap,count(0) as login_day from (
    select id,login_date,date_sub(login_date,rank_id) as date_gap from (
        select id,login_date
            ,row_number() over(partition by id order by login_date) as rank_id 
        from temp.user_login_log
    ) a
) b 
group by id,date_gap
order by id,date_gap

数据结果

iddate_gaplogin_day
12024-04-244
12024-04-253
12024-04-264
22024-04-241
22024-04-261
22024-04-281
22024-04-292

连续登录天数login_day 一目了然了。

4.分组求最长连续登录天数

select id,max(login_day) as max_login_day from (
  select id,date_gap,count(0) as login_day from (
    select id,login_date,date_sub(login_date,rank_id) as date_gap from (
      select id,login_date
      ,row_number() over(partition by id order by login_date) as rank_id 
      from temp.user_login_log
    ) a
  ) b 
  group by id,date_gap
) c
group by id
order by id

数据结果

idmax_login_day
14
22

用户1最长登录天数为4天,用户2最长登录天数为2天。

5.衍生问题解答

如果求解的不是最长连续登录天数,而是连续登录n天的所有记录呢?

可以考虑用lead()函数尝试求解。

下期进行完整解答。

以上,本期全部内容。

感谢阅读。

按例,欢迎点击此处关注我的个人公众号,交流更多知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/604078.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

正点原子Linux学习笔记(五)FrameBuffer 应用编程

FrameBuffer 应用编程 19.1 什么是 FrameBuffer19.2 LCD 的基础知识19.3 LCD 应用编程介绍使用 ioctl()获取屏幕参数信息使用 mmap()将显示缓冲区映射到用户空间 19.4 LCD 应用编程练习之 LCD 基本操作19.5 LCD 应用编程练习之显示 BMP 图片在 LCD 上显示 BMP 图像在开发板上测…

超强动画制作软件blender

blender中文手册:Blender 4.1 Manual Blender 是一款集3D建模、渲染、动画、视频编辑、音频处理、游戏设计等多功能于一体的软件。由于其开源性质,它拥有庞大的用户群体和活跃的开发者社区,这使得Blender的功能和性能得到了不断的提升和优化…

Windows内核开发:如何使用STL

前言 大家都知道应用层c的STL非常强大,非常好用,但是在内核下就没法用了。针对这个问题,经过我不懈的寻找,终于找到了解决内核无法使用STL的方法。 使用new/delete关键字 先说一下常用关键字如何在内核中使用。其实只需要在一个全…

第四十节实现主人公的技能释放功能(二)实现技能按钮

看看我们今天要实现的效果是,当我们按下数字1快捷键,我们的技能按钮会进入倒计时,如下图演示: 一、新建场景和根节点设置 新建场景,选择TextureButton作为根节点,重名为SpellButton,保存场景…

啸叫抑制器采用什么处理芯片?ES56031或PH56031

会议系统或卡拉OK最头疼的就是啸叫了吧,来看看啸叫抑制器采用什么芯片 四通道啸叫抑制器,采用了2个电路板,每个板子处理2路信号,每块电路板有2个卡侬输入插座,2个卡侬输出插座 ES56031S,该啸叫抑制器为4通道…

【优选算法】——双指针——Leetcode——283.移动零

目录 ​编辑 1.题目 2. 解法(快排的思想:数组划分区间-数组分两块): 1.算法思路: 2.算法流程: 3.代码实现 1.C语言 2.C 1.题目 283. 移动零 提示 给定一个数组 nums,编写一个函数将所有…

MySQL增删查改(进阶)

目录 数据库约束 表的设计 查询操作的进阶 查询搭配插入使用 聚合查询 1>count(*) 2>sum(*) 3>avg(*) 4>max(*) 5>min(*) group by分组分别进行聚合查询 联合查询 / 多表查询[重点] 外连接 自连接 子查询 合并查询 小结: 数据库约束 有时候…

cesium雷达扫描(消逝圆效果)

cesium雷达扫描(消逝圆效果) 以下为源码直接复制可用 1、实现思路 通过修改“material”材质来实现轨迹球效果 2、示例代码 1、index.html <!DOCTYPE html> <html lang="en"><head><!

小猪APP分发:重塑应用分发市场的创新力量

在移动互联网蓬勃发展的今天&#xff0c;应用分发平台作为连接开发者与用户的桥梁&#xff0c;扮演着至关重要的角色。然而&#xff0c;随着市场的饱和&#xff0c;如何在众多平台中脱颖而出&#xff0c;为开发者提供更宽广的舞台&#xff0c;同时确保用户能够便捷、安全地获取…

【linux】dmesg工具

dmesg介绍 dmesg工具用途&#xff1a; dmesg - print or control the kernel ring buffer kernel ring buffer, 内核环形缓冲区&#xff0c;也叫环形队列&#xff0c;Linux内核日志就存储在一个环形队列中&#xff0c;环形队列满的时候&#xff0c;新的消息会覆盖掉旧的消息。…

小程序支付的款项流转与到账时间

商家做小程序&#xff0c;最关心的是客户通过小程序下单支付的钱&#xff0c;是怎么样的流转状态以及最终到哪里。因此&#xff0c;本文将详细解析款项最终流向何处以及多久能够到账。 一、小程序支付的款项流向 当用户在小程序内完成支付后&#xff0c;款项并不会直接到达商…

CSRF漏洞简介

csrf简介 CSRF 全称为跨站请求伪造&#xff08; Cross-site request forgery &#xff09;&#xff0c;是一种网络攻击方式&#xff0c;在 CSRF 的攻击场景中攻击者会伪造一个请求&#xff08;这个请求一般是一个链接&#xff09;&#xff0c;然后欺骗目标用户进行点击&#xf…

C51版本Keil + STC-ISP 实现第一盏灯,从创建到实现

创建项目 1. 新建项目 Project -> New uVision Project 2.1 新建文件夹 2.2 输入文件名称, 并保存 3.1 选择当前位STC芯片的开发板&#xff0c;选择STC MCU Database 搜素具体芯片型号&#xff0c;进行配置&#xff1a; 3.2 选择通过搜索框搜索到stc相关芯片信息 如果st…

linux数据备份与恢复

目录 前言 1、数据备份和恢复中的两个关键性指标 2、linux系统的定时任务 1&#xff09;本地定时任务crontab 在实验测试过程中&#xff0c;遇到多次crontab任务不执行问题 &#xff0c;总结下来主要有几个方面原因&#xff1a; 2)分布式定时任务系统Jenkins 3、备份存储…

机房——蓝桥杯十三届2022国赛大学B组真题

问题分析 这题用深搜广搜都能做&#xff0c;不过我更倾向于用广搜&#xff0c;因为广搜能更容易找到目标点。那么是采用结构体存储边还是采用二维数组存储临接矩阵呢&#xff1f;我们注意到n的取值范围为1e5,用二维数组哪怕是bool类型就需要至少1e10Byte的连续空间,这个空间太大…

为软件教学文档增加实践能力

为了更方便软件教学&#xff0c;我们在凌鲨(OpenLinkSaas)上增加了公共资源引用的功能。 目前可以被引用的公共资源: 微应用常用软件公共知识库Docker模板 引用公共资源 引用微应用 目前微应用包含了主流数据库&#xff0c;终端等工具&#xff0c;可以方便的进行各种相关实…

【25届秋招备战C++】23种设计模式

【25届秋招备战C】23种设计模式 一、简介程序员的两种思维8大设计原则 二、具体23种设计模式2.1 创建型模式2.2 结构性模式2.3 行为型模式 三、常考模式的实现四、参考 一、简介 从面向对象谈起&#xff0c; 程序员的两种思维 底层思维:向下 封装&#xff1a;隐藏内部实现 多…

ASP.NET小型证券术语解释及翻译系统的设计与开发

摘 要 在系统设计上&#xff0c;综合各种翻译类型网站优缺点&#xff0c;设计出具有任何使用者都可添加术语信息的且只有管理员能够实现术语修改及删除等独特方式的术语查看管理系统。此方式能够使术语量快速增大&#xff0c;并且便于使用者及管理员操作&#xff0c;满足相互…

软件设计师-应用技术-面向对象程序设计题5

考题形式&#xff1a; 代码填空&#xff0c;5 - 6空&#xff0c;每空3分。 基础知识及技巧&#xff1a; 1. 类的定义&#xff1a; 2. 接口的定义&#xff1a; 给实现类具体代码&#xff0c;填写接口中方法。 3. 类、抽象类、继承类、抽象方法的定义&#xff1a; 抽象类&…

【管理咨询宝藏95】SRM采购平台建设内部培训方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏95】SRM采购平台建设内部培训方案 【格式】PDF版本 【关键词】SRM采购、制造型企业转型、数字化转型 【核心观点】 - 重点是建设一个适应战略采…
最新文章