sql子查询超经典例题:--连续3天登录的用户筛选

SQL连续登录、活跃、持仓天数问题 面试常问问题之SQL连续问题@SQL连续**问题编辑于2024-10-10在我们面试过程当中,经常会被问到经典的SQL连续问题,可能是连续10天活跃用户数,可能是连续十天登录的用户,也可能是计算用户的持仓天数。下面我们综合chatGPT和力扣来进行一下SQL连续问题的一个汇总。 阅读详情

create table user_login(
    user_id number(8),
    login_time varchar2(50)
);

insert into user_login values (1,'2022-06-01 11:00:00');
insert into user_login values (1,'2022-06-01 12:00:00');
insert into user_login values (1,'2022-06-01 12:00:00');
insert into user_login values (1,'2022-06-02 11:00:00');
insert into user_login values (1,'2022-06-03 11:00:00');
insert into user_login values (2,'2022-06-01 11:00:00');
insert into user_login values (2,'2022-06-02 11:00:00');
insert into user_login values (2,'2022-06-04 11:00:00');
insert into user_login values (3,'2022-06-01 11:00:00');
insert into user_login values (3,'2022-06-02 11:00:00');
insert into user_login values (3,'2022-06-04 11:00:00');
insert into user_login values (3,'2022-06-05 11:00:00');
insert into user_login values (3,'2022-06-06 11:00:00');
insert into user_login values (3,'2022-06-07 11:00:00');
insert into user_login values (3,'2022-06-08 11:00:00');
select * from user_login;

思路:
1、因为每天用户登录次数可能不止一次,所以需要先将用户每天的登录日期去重。
2、再用row_number() over(partition by _ order by _)函数将用户id分组,按照登录日期进行排序。
3、计算登录日期减去第二步骤得到的结果值,用户连续登录情况下,相减的结果都相同。
4、按照id和日期分组并计数,筛选大于等于3的即为连续3天登录的用户。

select t2.userid from
(select t1.user_id userid,t1.ymd,t1.ymd-t1.rn plus from 
(select user_id,
       trunc(to_date(login_time,'yyyy-mm-dd hh:mi:ss'),'dd') ymd,
       row_number()over(partition by user_id order by trunc(to_date(login_time,'yyyy-mm-dd hh:mi:ss'),'dd')) rn
from user_login group by user_id,trunc(to_date(login_time,'yyyy-mm-dd hh:mi:ss'),'dd')) t1) t2
group by t2.userid,t2.plus
having count(1)>=3

1.按照用户和年月日进行分组,保证每个用户,每天的记录只有一条:
select user_id,trunc(to_date(login_time,'yyyy-mm-dd hh:mi:ss'),'dd') ymd       
from user_login group by user_id,trunc(to_date(login_time,'yyyy-mm-dd hh:mi:ss'),'dd')
order by user_id;

2.上一步的结果,按照用户分组,并在组内给每一条记录编号
select user_id,trunc(to_date(login_time,'yyyy-mm-dd hh:mi:ss'),'dd') ymd,
    row_number()over(partition by user_id order by trunc(to_date(login_time,'yyyy-mm-dd hh:mi:ss'),'dd')) rn
from user_login group by user_id,trunc(to_date(login_time,'yyyy-mm-dd hh:mi:ss'),'dd')

3.ymd-rn
select t1.user_id,t1.ymd,t1.rn,t1.ymd-t1.rn plus_date from 
(select user_id,trunc(to_date(login_time,'yyyy-mm-dd hh:mi:ss'),'dd') ymd,
    row_number()over(partition by user_id order by trunc(to_date(login_time,'yyyy-mm-dd hh:mi:ss'),'dd')) rn
from user_login group by user_id,trunc(to_date(login_time,'yyyy-mm-dd hh:mi:ss'),'dd')) t1

4.按照user_id和减法之后的日期plus_date两项分组
select t2.user_id,t2.plus_date,count(1)    from 
(select t1.user_id,t1.ymd,t1.rn,t1.ymd-t1.rn plus_date from 
(select user_id,trunc(to_date(login_time,'yyyy-mm-dd hh:mi:ss'),'dd') ymd,
    row_number()over(partition by user_id order by trunc(to_date(login_time,'yyyy-mm-dd hh:mi:ss'),'dd')) rn
from user_login group by user_id,trunc(to_date(login_time,'yyyy-mm-dd hh:mi:ss'),'dd')) t1) t2
group by t2.user_id,t2.plus_date
having count(1)>=3

SQL窗口函数实战:高效计算用户连续登录天数与最大连续登录天数 在数据分析与用户行为洞察领域,序列分析是处理时间序列数据的核心技术,常用于识别连续事件模式。其核心原理是通过窗口函数为有序数据生成行号,并利用日期与行号的差值运算,将连续性判断转化为确定性的分组问题,从而高效识别连续区间。这项技术的价值在于能直接在数据库层面完成复杂计算,避免海量数据I/O瓶颈,极大提升处理性能。典型应用场景包括用户活跃度分析、连续签到统计、流失预警及生命周期价值评估等。本文以用户登录日志分析为例,深入讲解如何使用ROW_NUMBER()窗口函数和日期差值技巧,解决“连续登录天数”这一经典的 阅读详情

相关推荐

大数据面试之Hive SQL经典面试题

请注意,这种方法并没有真正地将行转换为独立的列,而是将多个行的值合并到了一个字符串中。在Hive中,由于schema是静态的,将任意数量的行转换为固定数量的列是不直接支持的。如果知道商品ID的最大数量,并且这个数量是固定的,可以使用条件聚合和。然后,在外部查询中,筛选出序列号小于等于 N 的记录,即销售额最高的前 N 个记录。希望将每个用户的购买记录从行格式转换为列格式,以展示每个用户购买的每个商品。列存储每个订单所购买的商品数组,数组中每个元素都是一个元组,包含商品ID和数量。

涛声依旧, 万古流名 4037

oracle按照日期求连续天数的数据sql

/*求出连续三天都符合条件的数据,如果有一天不连续,即不取出*/  SELECT ACCOUNT,OCCUR_DATE,START_DATE,SITE_NO,END_DATE,AMOUNT FROM(    SELECT ACCOUNT,(SELECT DATA_DATE FROM MC_DATA_DATE) OCCUR_DATE,MIN(OCCUR_DATE) START_DATE

tanzugan的专栏 6369

SQL窗口函数实战:两种高效方法精准计算用户连续登录天数

在数据分析领域,窗口函数是处理序列和分组计算的核心技术,它允许在不聚合数据的前提下,对数据集的子集进行排序、排名和聚合运算。其原理是通过定义数据窗口,为每一行关联一个计算上下文,从而解决诸如排名、移动平均、累计求和以及连续性判断等复杂问题。这一技术价值在于能够以声明式、高性能的方式完成以往需要多重自连接或循环才能实现的分析任务,极大提升了数据处理的效率和代码的可读性。在用户行为分析、时间序列计算等应用场景中,窗口函数尤为重要。例如,在评估用户粘性时,经常需要从海量登录日志中识别用户的连续登录行为,这正是窗口

weixin_34161083的博客 585

SQL 实现要求连续三天以及以上,并且每天人流量不少于100

with t1 as ( select id, `date` as dt, row_number() as num_id, people from stadium ) , t2 as ( select id, `date` as dt, row_number() as num_id, people from stadium ) , t3 as ( select id, `date` as...

杨鑫newlife的专栏 8435

05-SA8155 QNX Display框架及代码分析(1)

显示是非常重要的一个模块,人机交互的桥梁。那么SA8155 Hypervisor显示是如何处理的呢。对处理流程非常的好奇O(∩_∩)O哈哈~。TODO。

静虚待令,有物混成 1万+

C/C++_五大常规算法_分治算法

分治法 一个装有 16 枚硬币的袋子,16 枚硬币中有一个是伪造的,伪造的硬币和普通硬币从表面上看不出有任何差别,但是那 个伪造的硬币比真的硬币要轻。现有给你一台天平,请你在尽可能最短的时间内找出那枚伪造的硬币。 常规思维: 每次从待比较的硬币中取两枚进行计较,如果天平平衡(相等)就继续取剩下的硬币进行比较 继续以上过程,直到找到硬币。 强者思维: 我们先将 16 枚硬币分为左右两个部分,各为 8 个硬币,分别称重,必然会有一半轻一半重,而我们要的就是轻的那组,重 的舍去。接下来我们继续对轻的进行五五分

weifc-wei 的博客 2726

【SQL经典题目】连续日期判断、同时在线人数、会话划分、间隔日期连续、日期交叉

一些经典的SQL题目

想当运维的程序猿 2037

ZYNQ RFSoC 的DAC如何做到从 0到Fs频段 信号输出

之前一直没太了解 RFSoC 的DAC如何输出在 Fs/2 到 Fs 频率范围内的信号,例如 ZCU216中的 ZU49DR,其RF-DAC最大采样率是 9.85GSPS,如果想输出的信号中心频率在5.8G,它是如何有效输出在第二奈奎斯特区域范围的信号的。

weixin_44630490的博客 1554

SparkSQL统计——连续3天或以上

前言:本章用到了开窗函数,不了解的可以去看看。 SQL开窗函数(窗口函数)详解_流水随清风的博客-优快云博客_sql开窗函数 数据源下载: 链接: https://pan.baidu.com/s/1WMz8B-xJZjOoMmlaLurjZg 提取码: eetv 数据源展示: 案例实现要求:统计每月连续3天或以上的用户个数 思路讲解: 1.以当前时间为基准值,获取到前面两天的时间以及后面两天的时间 通过lag和lead获取,注意它们的默认值,以及over中的排序为升.

JIE的博客 --- moon_coder 3686

miRNA测序数据生信分析——第一讲,总结概述

这里的miRNA测序指转录水平的测序。这里每一个数据库都可以在线访问,但是如果要本地使用,都需要进行数据库文件下载,整理。

weixin_44616693的博客 4956

大数据领域数据架构的工业互联网数据架构设计

工业互联网作为第四次工业革命的重要驱动力,正在深刻改变传统制造业的生产方式和商业模式。本文旨在探讨工业互联网环境下的大数据架构设计,重点解决工业数据采集、传输、存储、处理和分析等关键环节的技术挑战。工业互联网数据架构的核心组件大数据技术在工业场景下的应用数据治理和质量控制边缘计算与云计算的协同架构背景介绍:建立基本概念和问题域核心架构:详细解析工业互联网数据架构技术实现:通过代码和数学模型展示关键技术实践案例:展示真实场景应用工具资源:推荐实用开发工具和学习资源。

软件工程实践的博客 858

mysql如何查询某个店铺连续三天>=100的数据

mysql查询某个店铺连续3天营业额>=100的数据

sinat_41600072的博客 768

【Tessy】集成测试小白入门指导

本文详细介绍了如何进行集成测试的小白入门指导,从新建工程到设计用例,实现集成测试的过程详细步骤

qq_37282365的博客 1194

SQL连续登录4天及以上的用户

sql求连续登录4天及以上的用户

qq_36261988的博客 1721

Openclaw第5章 知识库管理

💡:学会使用 OpenClaw构建个人知识库系统,实现网页文章存档、GitHub项目管理、论文笔记整理和跨设备同步。

Maynor的博客 777

对称式目镜设计实例

对称式目镜设计实例

weixin_72050316的博客 1163

Hive sql实现查询连续n天登录的用户

用个排序的窗口函数即可实现: select distinct user_id from ( select user_id , continue_date , count(login_date) as continue_day_cnt from ( select user_id , login_date ...

chenzhh25的博客 3541

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SQL查询连续登陆的用户

这段SQL查询的核心目标是找出连续登录天数大于等于3天的用户。注:登录表为单日随机一次登录数据,该题忽略单日多次登录情况。解释:1102在9日、10日、11日,登陆了系统满足查询条件;1106在10日、11日、12日登录了系统满足查询条件。(log_id-登录动作id,user_id-用户id, log_time-登录时间, log_port-登录端口)(user_id-用户id, reg_time-注册时间, reg_port-注册端口)是关键的一步,用于识别连续登录的天数。子查询的作用及其背后的逻辑。

piaoyunlive的博客 1007

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

用一句SQL找出连续7天在线的用户

废话不多说先上SQL: select 活跃用户, 登录天数 from (select 用户 as 活跃用户 ,count(用户) as 登录天数 from(select distinct log ,用户 from rihuo) as aaa group by 用户) as ccc where 登录天数=7; 括号不能省略,这里用了两次子查询。类似嵌套,先执行最里面的查询,再用结果查询。 解释: mysql> select * from rihuo ; +-----------+------..

q853820288的博客 1728

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【面试题】Hive 查询:如何查找用户连续三天登录的记录

在分析用户行为时,查询用户的连续登录数据是一个常见需求。例如,我们需要找出每个用户连续三天登录的记录。给定一个包含用户登录记录的表,我们需要对这些数据进行处理,提取出用户连续三天登录的日期。

weixin_63297999的博客 1348

连续60天畅销产品怎么找?SQL相邻问题之连续登录的四种解法

        SQL中关于连续登录问题也是经常遇到的难点,Leetcode上有很多花样百出的考察连续问题的题目。简单点的,对初学者来说很容易解答,但是真在实际工作中遇到恐怕会遇到各种各样的问题。        有时候看到一些职场人士吐槽现在SQL考察越来越难了,几年前的“难题”现在成了入门级的。而我们现在初学者练习的基本SQL题远不能让你真正掌握SQL取数要

Data_lukyo的博客 649

SQL面试真题解析:如何筛选每月消费超千元的高价值用户

SQL作为数据处理的核心语言,其分组聚合与条件筛选功能在数据分析中至关重要。通过GROUP BY结合聚合函数可以实现数据的分组统计,而HAVING子句则用于对分组结果进行筛选。这类技术在用户行为分析、消费特征识别等业务场景中具有广泛应用价值。以识别高价值用户为例,需要综合运用日期处理函数、多级分组聚合等技术手段,其中MIN(monthly_amount) > 1000的条件判断能有效确保用户每月消费达标。实际应用中还需考虑不同数据库系统的语法差异和查询性能优化,如建立日期索引、使用EXTRACT函数替代格式

weixin_34178244的博客 381

【Sql-01】求连续七天登陆的用户

【代码】SQL-01求连续七天登陆的用户。

笔生花的博客 1486

SQL进阶:从语法到解题思维,掌握连续登录分析实战

SQL作为关系型数据库的核心查询语言,其本质是一种声明式编程范式,用户只需描述所需的数据结果,而无需指定具体的执行步骤。这一特性使得SQL在处理集合操作时具有天然优势,能够高效完成数据筛选、聚合与关联。理解SQL的逻辑执行顺序(FROM→WHERE→GROUP BY→HAVING→SELECT→ORDER BY)是编写复杂查询的基础,它决定了数据处理的流程与结果。在实际工程中,窗口函数和公共表表达式(CTE)等高级特性极大地扩展了SQL的分析能力,例如在用户行为分析、业务报表生成等场景下,能够高效解决诸如连

weixin_30727835的博客 398

查询最近3天连续登录的用户总数

select SUM(count) from ( select COUNT(登录时间) as countValue,if(COUNT(登录时间)>=3,1,0) count from ( SELECT curdate() as mycreatedate union all SELECT date_sub(curdate(), interval 1 day) as mycreatedate union ...

ChuandongTan的博客 382

遇到连续问题怎么办?

有一张“用户登陆记录表”,包含两个字段:用户id、日期。 【问题】查询2021年每个月,连续2天都有登陆的用户名单。 【解题步骤】 1.思路 怎么能知道连续登陆用户呢? 首先对用户连续登陆进行标记 select 用户id,日期, month(日期) as 月, day(日期) as 日, row_number() over (partition by month(日期), 用户id order by 日期) as 每个月登陆顺序 from 用户登陆.

aiyoufyc001的博客 215
上一篇: 索引和sql优化
下一篇: 存储过程经典例题演示:按科目统计分数段的人数;把各科成绩显示在一条记录里。
好好羊
博客等级 码龄5年 5粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好好羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值