大数据SQL面试题每日一题系列:现有用户登录记录表,请查询出用户连续三天登录所有的数据记录

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

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

1.题目

问题:以下为多个用户每日登录记录数据,已经按照用户登录日期进行了去重处理,求解出每个用户连续三天登录所有的数据记录

此题也和求解用户连续登录n天的次数题目求解方式重合。

2.基础数据准备

基于上一题SQL面试题每日一题-求解用户最长连续登录天数数据源做了一定修正,方便理解。

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
22024-04-25
22024-04-28
22024-05-02
22024-05-03
22024-05-04

期望结果

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

期望输出结果中会看到用户1有25,26,27日记录,也会有26,27,28日的记录,那么26,27就会出现两次

3.问题分析

求解每个用户连续三天登录的所有数据记录,相较于上一个连续问题,其区别在于需要考虑明细数据的展示,其解决问题的办法就完全不同了。考察的是对日期加减函数的使用以及对偏移量开窗函数的应用

排序开窗函数详见SQL窗口分析函数使用详解系列三之偏移量类窗口函数

期望输出结果中会看到用户1有25,26,27日记录,也会有26,27,28日的记录,那么26,27就会出现两次,原来数据表中只有一次,所以还是得“生成”数据;

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

4.解题SQL

1.原始数据求偏移值

使用lead()函数按照用户分组,日期排序,求出后面第三行的日期offset_day1,使用date_add()求解出第三天的日期offset_day2

通过两种方式的偏移值是否相等来进行判断是否连续三天登录

select id,login_date,lead(login_date,2) over(partition by id order by login_date) as offset_day1,date_add(login_date,2) as offset_day2 
from temp.user_login_log
order by id,login_date

数据结果

idlogin_dateoffset_day1offset_day2
12024-04-252024-04-272024-04-27
12024-04-262024-04-282024-04-28
12024-04-272024-04-302024-04-29
12024-04-282024-05-012024-04-30
12024-04-302024-05-022024-05-02
12024-05-012024-05-042024-05-03
12024-05-022024-05-052024-05-04
12024-05-04(null)2024-05-06
12024-05-05(null)2024-05-07
22024-04-252024-05-022024-04-27
22024-04-282024-05-032024-04-30
22024-05-022024-05-042024-05-04
22024-05-03(null)2024-05-05
22024-05-04(null)2024-05-06

清晰的看到偏移窗口函数和日期加减函数的值,之后进行比较。

2.判断是否连续登录

判断当日及之后是否连续三天登录,如果两个偏移值相等则代表为连续登录,否则为非连续登录。

计算出is_cont,然后根据is_cont的标识进行筛选初试连续的日期。比如用户1在25,26,27三天连续登录,筛选出其第一天的日期25。

select id,login_date,offset_day1,offset_day2,if(offset_day1 = offset_day2,1,0) as is_cont 
from (select id,login_date,lead(login_date,2) over(partition by id order by login_date) as offset_day1,date_add(login_date,2) as offset_day2 from temp.user_login_log
) a
order by id,login_date

数据结果

idlogin_dateoffset_day1offset_day2is_cont
12024-04-252024-04-272024-04-271
12024-04-262024-04-282024-04-281
12024-04-272024-04-302024-04-290
12024-04-282024-05-012024-04-300
12024-04-302024-05-022024-05-021
12024-05-012024-05-042024-05-030
12024-05-022024-05-052024-05-040
12024-05-04(null)2024-05-060
12024-05-05(null)2024-05-070
22024-04-252024-05-022024-04-270
22024-04-282024-05-032024-04-300
22024-05-022024-05-042024-05-041
22024-05-03(null)2024-05-050
22024-05-04(null)2024-05-060

可以看出用户1在25号和26号以及30号存在连续登录3天的记录。用户2在05-02存在连续登录三天的记录。

3.筛选连续登录日期

筛选出开始连续登录的日期

select id,login_date,offset_day1,offset_day2,if(offset_day1 = offset_day2,1,0) as is_cont 
from (select id,login_date,offset_day1,offset_day2,if(offset_day1 = offset_day2,1,0) as is_cont from (select id,login_date,lead(login_date,2) over(partition by id order by login_date) as offset_day1,date_add(login_date,2) as offset_day2 from temp.user_login_log) a
) b where b.is_cont = 1
order by id,login_date

数据结果

idlogin_dateoffset_day1offset_day2is_cont
12024-04-252024-04-272024-04-271
12024-04-262024-04-282024-04-281
12024-04-302024-05-022024-05-021
22024-05-022024-05-042024-05-041

筛选出来的结果。

至此,这个可以作为另外一个题目:

判断用户连续登录n天的次数。

实际例子,判断用户连续登录三天的次数。用户1为3次,用户2为1次。

4.生成维表

生成一个0,1,2三行记录的数据。

select explode(array(0,1,2)) as date_list;

这里面涉及到了hive的explode爆炸函数

数据结果

date_list
0
1
2

5.得到预期结果

通过3和4步骤的结果表进行笛卡尔积,得到最终结果。

select c.id,c.login_date,date_add(c.login_date,d.date_list) as login_date_list 
from (select id,login_date,offset_day1,offset_day2,if(offset_day1 = offset_day2,1,0) as is_cont from (select id,login_date,offset_day1,offset_day2,if(offset_day1 = offset_day2,1,0) as is_cont from (select id,login_date,lead(login_date,2) over(partition by id order by login_date) as offset_day1,date_add(login_date,2) as offset_day2 from temp.user_login_log) a) b where b.is_cont = 1
) c
,(select explode(array(0,1,2)) as date_list
) d
order by id,login_date_list

数据结果

idlogin_datelogin_date_list
12024-04-252024-04-25
12024-04-252024-04-26
12024-04-252024-04-27
12024-04-262024-04-26
12024-04-262024-04-27
12024-04-262024-04-28
12024-04-302024-04-30
12024-04-302024-05-01
12024-04-302024-05-02
22024-05-022024-05-02
22024-05-022024-05-03
22024-05-022024-05-04

可以看到用户连续登录的记录在login_date_list列完整展现出来了,和预期结果一致。

5.衍生问题解答

如果求解的不是用户连续三天登录所有记录,而是连续登录之外的断点记录呢?

用另一句话说就是用户哪天没有登录的记录

这个需要我们进行维表数据生成以进行数据求解

下期进行完整解答。

以上,本期全部内容。

感谢阅读。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Shader 纹理动画和顶点动画

一、内置变量--时间 要实现动画,我们需要把时间添加到计算当中,让画面可以随着时间变化而变化。在Unity Shader提供了如下关于时间的内置变量以便于在shader中访问时间实现各种动态效果。 名称类型描述_Timefloat4t是自该场景加载开始所经过的时间&…

车载测试___面试题和答案归纳

车载面试题 一、实车还在设计开发阶段,大部分测试通过什么测试? 答案:通过台架和仿真来完成的 二、测试部分划分? 测试部门是分为自研,系统,验收,自研部门是开发阶段测试,系统部门…

重发被恶意举报的主食冻干测评,速看可能再被删!PR、希喂和SC真实对比PK!

要给猫咪提供高品质主食,主食冻干是不二之选。主食冻干不仅含肉量高、吸收消化率高,还有着丰富的、普通猫粮无法提供的各类营养素,满足猫咪微量元素的需求。可以说是营养与生骨肉喂养媲美,又能完美避开生骨肉细菌超标带来的一系列…

如何优雅的实现接口限流?

首先限流,其实解决方案有很多,比如通过nginx配置,通过gateway网关进行限流,比如Spring Cloud GateWay整合熔断器实现限流 但是以上都是全局的,如何灵活的针对某些接口进行不同级别的限流呢? 方案一&#…

超标量处理器设计:重排序缓存(ROB)

★超标量处理器的很多地方用到了重排序缓存,但是我对它不是很了解,所以我整理一下重排序缓存的知识点。 重排序缓存(ROB)在确保乱序执行的指令能够正确地完成和提交(Commit),也可以用来寄存器重命名。 ROB是一个先进先出的表,每个…

Re_Lasso

from sklearn.linear_model import LassoCV, Lasso import pandas as pd from sklearn.model_selection import train_test_split from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score from sklearn.model_selection import GridSearchCV# 读取数据…

【备战软考(嵌入式系统设计师)】10 - 软件工程基础

这一部分的内容是概念比较多,不要理解,去感受。 涉及的知识点是嵌入式系统开发和维护的部分,也就是和管理相关的,而不是具体如何进行嵌入式系统开发的细节。 系统开发生命周期 按照顺序有下面几个阶段,我们主要要记…

12 华三的二层链路聚合

12 华三的二层链路聚合 配置思路 1. 配置二层静态聚合组 (1) 进入系统视图。 system-view (2) 创建二层聚合接口,并进入二层聚合接口视图。 interface bridge-aggregation interface-number [ lite ] 创建二层聚合接口后,系统将自动生成…

前端代码优化

嗯,最近pc更新了一版,目前没有什么活,就检查自己写的代码,去优化,发现有一个函数if嵌套了很多层,重复的代码也有很多,所以我就把重复的进行来了提取,以及一些其他优化 原代码 可以…

代码随想录算法训练营DAY46|C++动态规划Part8|139.单词拆分、多重背包理论基础、背包问题总结篇

文章目录 139.单词拆分思路CPP代码 多重背包理论基础处理输入把所有个数大于1的物品展开成1个开始迭代,计算dp数组代码优化 背包问题总结篇 139.单词拆分 力扣题目链接 文章讲解:139.单词拆分 视频讲解:你的背包如何装满?| LeetCo…

计算方法实验9:Romberg积分求解速度、位移

任务 输出质点的轨迹 ( x ( t ) , y ( t ) ) , t ∈ { 0.1 , 0.2 , 0.3 , . . . , 10 } (x(t), y(t)), t\in \{0.1, 0.2, 0.3, ..., 10\} (x(t),y(t)),t∈{0.1,0.2,0.3,...,10},并在二维平面中画出该轨迹.请比较M分别取4, 8, 12, 16, 20 时,Romberg积分达…

go将时间对象切换到不同时区

编程的时候我们可能会遇到一些时区问题。在Go语言中,处理时区通常涉及到time包和time/tzdata包(如果需要更新时区数据)。这篇文章就写一下如何切换时区 一:直接上代码 package main import ( "fmt" "time&qu…

k8s持久化存储之OpenEBS

一、介绍 OpenEBS 是 CNCF 项目的一部分,采用 Apache v2 许可证。是 Kubernetes 部署使用最广泛且易用的开源存储解决方案。 目的: 让持久化工作负载的存储和存储服务完全集成到环境中,这样每个团队和工作负载都可以从控制的粒度和 Kubern…

蓝桥杯省三爆改省二,省一到底做错了什么?

到底怎么个事 这届蓝桥杯选的软件测试赛道,都说选择大于努力,软件测试一不卷二不难。省赛结束,自己就感觉稳啦,全部都稳啦。没想到一出结果,省三,g了。说落差,是真的有一点,就感觉和自己预期的…

mysql数据库和Oracle数据库除法或乘法,结果保留两位小数

在MySQL和Oracle数据库中,当你执行除法或乘法运算并希望结果保留两位小数时,你可以使用各自的内置函数来达到这个目的。 MySQL 在MySQL中,你可以使用ROUND()函数来四舍五入到指定的小数位数。例如,要保留两位小数,你…

汽车软件研发工具链丨怿星科技新产品重磅发布

“创新引领未来”聚焦汽车软件新基建,4月27日下午,怿星科技2024新产品发布会在北京圆满举行!智能汽车领域的企业代表、知名大企业负责人、投资机构代表、研究机构代表齐聚现场,线上直播同步开启,共同见证怿星科技从单点…

经典回溯算法之N皇后问题

问题描述: 有一个N*N的棋盘,需要将N个皇后放在棋盘上,保证棋盘的每一行每一列每一左斜列每一右斜列都最多只能有一个皇后。 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如…

Java | Leetcode Java题解之第71题简化路径

题目&#xff1a; 题解&#xff1a; class Solution {public String simplifyPath(String path) {String[] names path.split("/");Deque<String> stack new ArrayDeque<String>();for (String name : names) {if ("..".equals(name)) {if …

【基于 PyTorch 的 Python 深度学习】5 机器学习基础(3)

前言 文章性质&#xff1a;学习笔记 &#x1f4d6; 学习资料&#xff1a;吴茂贵《 Python 深度学习基于 PyTorch ( 第 2 版 ) 》【ISBN】978-7-111-71880-2 主要内容&#xff1a;根据学习资料撰写的学习笔记&#xff0c;该篇主要介绍了单 GPU 加速和多 GPU 加速&#xff0c;以及…

代码随想录leetcode200题之哈希表

目录 1 介绍2 训练3 参考 1 介绍 本博客用来记录代码随想录leetcode200题中哈希表部分的题目。 2 训练 题目1&#xff1a;242. 有效的字母异位词 C代码如下&#xff0c; class Solution { public:bool isAnagram(string s, string t) {vector<int> cnt1(26, 0), cnt…