请写sql满足业务:找到连续登录3天以上的用户

为了找到连续登录超过 3 天的用户,我们可以使用 SQL 窗口函数和递归查询来实现。假设有一个 user_logins 表,包含以下字段:

  • user_id(用户ID)
  • login_date(登录日期)

假设 login_date 是 DATE 类型,下面是实现该需求的 SQL 查询:

1. 数据库表结构与样本数据

CREATE TABLE user_logins (user_id INT,login_date DATE
);INSERT INTO user_logins (user_id, login_date) VALUES
(1, '2023-07-01'), (1, '2023-07-02'), (1, '2023-07-03'),(1, '2023-07-05'),
(2, '2023-07-01'), (2, '2023-07-03'), (2, '2023-07-04'),(2, '2023-07-05');

2. SQL 查询

WITH login_streaks AS (SELECTuser_id,login_date,login_date - INTERVAL ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date) DAY AS streak_idFROMuser_logins
),
streak_groups AS (SELECTuser_id,COUNT(*) AS streak_lengthFROMlogin_streaksGROUP BYuser_id, streak_id
)
SELECT DISTINCTuser_id
FROMstreak_groups
WHEREstreak_length > 3;

解析:

这段SQL代码通过使用公用表表达式(CTE)计算用户的连续登录天数,并筛选出连续登录天数大于等于3天的用户。我们将逐步解析这段SQL代码的每个部分。

1. WITH子句和CTE

SQL代码使用了两个CTE:login_streaks 和 streak_groups

CTE 1:login_streaks
WITH login_streaks AS (SELECTuser_id,login_date,login_date - INTERVAL ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date) DAY AS streak_idFROMuser_logins
),

目的:计算每个用户的登录日期,并为每个用户生成一个“连续登录标识符”(streak_id)。

关键点

  • ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date):为每个用户按login_date排序的每一行生成一个唯一的行号。
  • login_date - INTERVAL ROW_NUMBER() DAY:通过减去行号的天数来生成一个“连续登录标识符”。如果用户在连续的日期登录,减去行号后得到的结果将是相同的。

例如:

  • 假设用户在 2024-07-01 和 2024-07-02 登录,那么:
    • 2024-07-01 - INTERVAL 1 DAY = 2024-06-30
    • 2024-07-02 - INTERVAL 2 DAY = 2024-06-30
    • 这两个记录的“连续登录标识符”将是相同的 2024-06-30,表明它们是连续登录的。
CTE 2:streak_groups
streak_groups AS (SELECTuser_id,COUNT(*) AS streak_lengthFROMlogin_streaksGROUP BYuser_id, streak_id
)

目的:计算每个用户的每个“连续登录标识符”对应的连续登录天数。

关键点

  • GROUP BY user_id, streak_id:按用户和“连续登录标识符”分组。
  • COUNT(*) AS streak_length:计算每个分组的记录数量,即连续登录的天数。

最终查询

SELECTuser_id
FROMstreak_groups
WHEREstreak_length >= 3;

目的:筛选出连续登录天数大于等于3天的用户。

关键点

  • WHERE streak_length >= 3:只选择连续登录天数(streak_length)大于等于3的用户。

完整解析

  1. login_streaks CTE

    • 为每个用户生成一个包含user_idlogin_datestreak_id的临时表。
    • streak_id 标识用户的连续登录,具有相同streak_id的记录表示用户的连续登录序列。
  2. streak_groups CTE

    • 计算每个用户的每个streak_id对应的连续登录天数。
    • 结果表包含user_idstreak_length
  3. 最终查询

    • streak_groups中筛选出streak_length大于等于3的用户。

示例数据和结果

假设user_logins表包含以下数据:

user_idlogin_date
12024-07-01
12024-07-02
12024-07-03
12024-07-05
22024-07-01
22024-07-03
22024-07-04
2

2024-07-05

Step 1login_streaks CTE结果:

user_idlogin_datestreak_id
12024-07-012024-06-30
12024-07-022024-06-30
12024-07-032024-06-30
12024-07-052024-07-02
22024-07-012024-06-30
22024-07-032024-07-01
22024-07-042024-07-01
22024-07-052024-07-01

Step 2streak_groups CTE结果:

user_idstreak_length
13
11
21
23

Step 3: 最终查询结果:

user_id
1
2

总结

这段SQL代码通过使用两个CTE,先计算每个用户的连续登录天数,然后筛选出连续登录天数大于等于3天的用户,非常适合于分析用户的活跃度和粘性。

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

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

相关文章

怎么提高音频声音大小?提高音频声音大小的四种方法

怎么提高音频声音大小?在音频处理和编辑中,增加声音的音量是一个常见的需求,尤其是在确保音频清晰度和听觉效果的同时。调整音频的音量不仅仅是简单地提高音频的响度,它也涉及到如何保持音质的高标准,确保没有失真或削…

后端登录校验——Filter过滤器和Interceptor拦截器

一、Filter过滤器 前面我们学会了最先进的会话跟踪技术jwt令牌,那么我们要让用户使用某些功能时就要根据jwt令牌来验证用户身份,来决定他是否登陆了、让不让用户访问这个页面(或功能) 但是这样一来,没发一个请求&…

绝区零启动遇到的问题

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 ​ 绝区零》作为米哈游的一款全新都…

【机器学习】(基础篇三) —— 线性回归

线性回归 本文介绍最经典的监督学习问题——线性回归,包括单变量线性回归和多变量线性回归 线性回归是回归任务,输入是带有标签的数据,根据数据关系,拟合出一个线性函数,并利用该函数进行预测等操作。线性回归分为单…

Python爬虫:BeautifulSoup的基本使用方法!

1.简介 Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析“标签树”等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。 Beautiful Soup…

回收站删除了是不是彻底删除了 回收站删除了怎么找回 回收站删除了还能找回来吗

电脑删除的数据文件一般不会直接被彻底删除掉,而是会暂存在回收站中,这样设计主要是为了防止误删除等操作,如果不小心删除了很重要的文件,只需要在回收站对文件进行还原即可。为了让大家更了解回收站,下面给大家详细讲…

MIT机器人运动控制原理浅析-人形机器人

MIT人形机器人基于开发改进的执行器全新设计,通过可感知执行器运动动力学移动规划器(Actuator-Aware Kino-Dynamic Motion Planner)及着地控制器(Landing Controller)等实现机器人的运动控制。 机器人设计 机器人高0.7米,21KG(四肢重量 25%),…

生物打印后的生物力学过程

生物打印后的生物力学过程 3D生物打印技术在组织工程领域展现出巨大的潜力,但打印后组织的生物力学特性对其最终成功至关重要。本文将详细介绍打印后组织的生物力学特性及其在组织工程中的应用。 1. 打印后水凝胶交联 原位交联可以在生物打印过程中提供足够的机械…

大数据面试题之Greenplum(2)

目录 Greenplum如何计算内存设置推荐值 Greenplum在哪里看日志? Greenplum 可用的客户端有哪些? Greenplum可以设置自动关闭空闲连接么? Greenplum 有没有支持非x86架构的版本,或者是支持arm、支持国产CPU的版本? …

Python 爬虫与 Java 爬虫:相似之处、不同之处和选项

在信息时代,网络上可用的数据量巨大且不断增长。为了从这些数据中提取有用的信息,爬虫已成为一种重要的技术。Python 和 Java 都是流行的编程语言,都具有强大的爬虫功能。本文将深入探讨 Python 爬虫和 Java 爬虫之间的差异,以帮助…

【RIP实验-熟悉基础配置】

实验拓扑 实验要求 根据实验拓扑的IP地址分配,为所有设备配置对应的IP地址和环回地址。全网运行RIPv2,将R1、R2、R3和R4的物理端口、Loopback地址和10.1.00网段进行宣告。并在rip协议下配置路由自动汇总,观察R1/R2是否能够收到10.0.0.0的详细…

Python虚拟环境:Virtualenv和Pipenv的安装理解与使用

Python虚拟环境:Virtualenv和Pipenv的安装理解与使用 引言 在Python开发中,一个常见的问题是不同项目依赖不同版本的库,这可能导致版本冲突。为解决这个问题,Python社区创造了虚拟环境工具,如Virtualenv和Pipenv。本…

Postman API网络:连接API开发的桥梁

🌐 Postman API网络:连接API开发的桥梁 在当今的API驱动世界中,Postman不仅是一款强大的API开发和测试工具,还提供了一个名为API网络的功能,它允许用户共享和发现API。通过API网络,开发者可以构建、测试、…

Go语言从字符串中匹配IPV6公网地址

package mainimport ("fmt""net""regexp" )func Ipv6PatternStr(data string) []net.IP {var ips []net.IP// 使用正则表达式匹配以240开头,可能包含::的IPv6地址部分// 注意:这个正则表达式不会确保整个IPv6地址的合法性…

门墙柜加工中心是做什么的?

门墙柜加工中心,带有六工序自动换刀,是一款主要针对门板、衣柜门板、墙板扣件等工件的加工设备。 它可以实现多种加工工艺,如侧孔、三合一、隐性件等连接件,铰链孔,天地铰链槽、门锁孔槽、免拉手槽、海棠槽、灯槽、拉…

Linux系统学习 —— 计算机基础(笔记篇)

一、电脑硬件 电脑硬件由输入,控制计算,输出三部分组成。 输入部分包括键鼠,读卡器(外部接口),扫描仪(打印机的扫描仪)。计算控制部分包括CPU , 内存,硬盘&…

EHT DUP transmission

在Wi-Fi 7(802.11be)中,DUP(Duplicated Transmission)传输是一种增强的传输机制,用于提高数据传输的可靠性和效率,特别是在高干扰环境下。下面将详细解释DUP传输过程及其意义,并给出…

从模型到应用:李彦宏解读AI时代的新趋势与挑战

如何理解李彦宏说的“不要卷模型,要卷应用” 开源项目的机遇与挑战 7月4日,2024世界人工智能大会暨人工智能全球治理高级别会议在上海世博中心举办。在产业发展主论坛上,百度创始人、董事长兼首席执行官李彦宏呼吁:“大家不要卷…

Shell学习——Shell printf命令

文章目录 printf命令 printf命令 printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认的 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。 printf 命令的语…

MATLAB数据统计描述和分析

描述性统计就是搜集、整理、加工和分析统计数据, 使之系统化、条理化,以显示出数据资料的趋势、特征和数量关系。它是统计推断的基础,实用性较强,在数学建模的数据描述部分经常使用。 目录 1.频数表和直方图 2 .统计量 3.统计…