it编程 > 数据库 > MsSqlserver

SQL语句查询连续N天登录用户(解决方案)

38人参与 2025-09-26 MsSqlserver

前几天刷手机时看到一道有趣的 sql 题:查询连续 3 天登录的用户。这让我联想到之前讨论过的开窗函数,深入思考后发现其实还有多种实现方式。今天就来和大家分享几种解决方案,欢迎一起讨论!

一、建表:还原场景问题

1.创建用户登录记录表t_login_records,包含用户 id 和登录日期两个核心字段

drop table if exists t_login_records;#若表存在删除
-- 创建用户登录记录表
create table t_login_records (
    id int primary key auto_increment,
    user_id int not null,
    login_date date not null
)engine=innodb default charset=utf8 collate=utf8_unicode_ci comment='用户登录记录表';

2.插入测试数据

-- 查看表结构	
desc t_login_records;

insert into t_login_records (user_id, login_date) values
(1, '2023-01-01'),
(1, '2023-01-02'),
(1, '2023-01-03'),  -- 用户1连续3天登录
(1, '2023-01-05'),
(2, '2023-01-01'),
(2, '2023-01-02'),
(2, '2023-01-04'),  -- 用户2不连续
(3, '2023-01-01'),
(3, '2023-01-02'),
(3, '2023-01-03'),  -- 用户3连续3天登录
(3, '2023-01-04'),  -- 用户3连续4天登录
(4, '2023-01-01'),
(4, '2023-01-03'),
(4, '2023-01-05'),  -- 用户4不连续    
(5, '2023-01-01'),
(5, '2023-01-02'),
(5, '2023-01-03'),  -- 用户5连续3天登录
(5, '2023-01-04'),  -- 用户5连续4天登录
(5, '2023-01-05'),	-- 用户5连续5天登录
(5, '2023-02-01'),	-- 断开
(5, '2023-02-02'),  -- 用户5再连续2天登录
(5, '2023-02-03');  -- 用户5再连续3天登录
select * from t_login_records;

二、查询:多种方法实现

1.自连接查询

-- 方法1:自连接查询
select distinct t1.user_id
from t_login_records t1
join t_login_records t2 
  on t1.user_id = t2.user_id 
  and datediff(t2.login_date, t1.login_date) = 1
join t_login_records t3 
  on t1.user_id = t3.user_id 
  and datediff(t3.login_date, t1.login_date) = 2;

2.窗口函数

-- 方法2:窗口函数(适用于支持lead函数的数据库,如mysql 8.0+、postgresql)
select distinct user_id
from (
  select 
    user_id,
    login_date,
    lead(login_date, 1) over (partition by user_id order by login_date) as next_day,
    lead(login_date, 2) over (partition by user_id order by login_date) as next_2_days
  from t_login_records
) t
where datediff(next_day, login_date) = 1 
  and datediff(next_2_days, login_date) = 2;

不满足条件,用户4未被选中。

3.日期差值分组

-- 方法3:日期差值分组(适用于支持row_number的数据库)
select user_id
from (
  select 
    user_id,
    login_date,
    date_sub(login_date, interval row_number() over (partition by user_id order by login_date) day) as grp
  from t_login_records
) t
group by user_id, grp
having count(distinct login_date) >= 3;

三、总结:三种方法对比与拓展

方法优点缺点
自连接简单直接,兼容性强性能差(多次扫描表)
窗口函数逻辑清晰,一步到位需数据库支持窗口函数
日期差值性能最优,逻辑巧妙理解难度较高

这道题虽然仅要求查询连续 3 天登录的用户,但通过这三种方法我们可以举一反三。如果要查询连续 4 天、5 天甚至 n 天登录的用户,第三种日期差值分组法更具优势,只需修改 having count(distinct login_date) >= n 即可实现 “一力破万法” 的效果!

到此这篇关于sql语句查询连续n天登录用户的文章就介绍到这了,更多相关sql连续n天登录用户内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

SQL语句实现用户连续登录最长天数

09-26

SQL注入的风险与解决方案实战解析

09-25

SQL Server查询包含某个字段的存储过程或触发器的一些常用方法

09-28

SQL中LAG、LEAD函数功能及用法

09-28

docker快速部署postgresql的完整步骤记录

09-29

SQL Server 查看备份计划的实现步骤

09-22

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论