MsSql

关注公众号 jb51net

关闭
首页 > 数据库 > MsSql > sql用户连续登录最长天数

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

作者:白话说数

文章详解如何用SQL计算用户连续登录最长天数,结合窗口函数与日期处理,通过CTE优化查询逻辑,该指标可助力用户分层、产品优化、运营评估及流失预警,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧

在上篇连续 N 天登录用户中,我们其实埋下了一个有趣的引子 —— 如何计算每个用户的连续登录最长天数?这个看似简单的需求,实则蕴含着 SQL 窗口函数与日期处理的巧妙结合。今天我们就来深入拆解这个问题,从技术实现到业务价值,带你全方位理解这一经典数据分析场景。

一、核心查询:用户连续登录最长天数

原理: 通过窗口函数和日期运算识别连续登录记录,并找出每个用户的最长连续登录天数、起始日期、终止日期。

1.多层嵌套子查询—抽丝剥茧看逻辑

-- 方法1:嵌套查询
-- 取rn=1每个用户连续登录最长的天数
-- 同一用户可能有多个连续登录周期,若存在最长周期相同,取距今最近的起始日期和终止日期
SELECT
	user_id,
	consecutive_days AS '连续登录最长天数',
	start_date AS '起始日期',
	end_date AS '终止日期' 
FROM
	(
    -- 用户连续登录天数降序排列,加序号
	SELECT
		*,
		ROW_NUMBER ( ) OVER ( PARTITION BY user_id ORDER BY consecutive_days DESC, nd_date DESC) AS rn
	FROM
		(
        -- 用户连续登录天数:可能有多个,只要断开就重新计算,最小为1
        -- 起始日期、终止日期
		SELECT
			user_id,
			COUNT( DISTINCT login_date ) AS consecutive_days,
			MIN( login_date ) AS start_date,
			MAX( login_date ) AS end_date 
		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 ser_id,grp 
		) a 
	) b 
WHERE
	rn = 1;

2.WITH 语句(CTE)—更优雅的语法结构

WITH ConsecutiveCTE AS (
    SELECT 
        user_id,
        COUNT(DISTINCT login_date) AS consecutive_days,
        MIN(login_date) AS start_date,
        MAX(login_date) AS end_date
    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
)
SELECT 
    user_id,
    consecutive_days AS '连续登录最长天数',
    start_date AS '起始日期',
    end_date AS '终止日期'
FROM (
    SELECT 
        *,
        -- 对每个用户,标记其最大连续天数的记录
        ROW_NUMBER ( ) OVER ( PARTITION BY user_id ORDER BY consecutive_days DESC, nd_date DESC) AS rn
    FROM ConsecutiveCTE
) ranked
WHERE rn = 1; -- 只保留每个用户最大连续天数的记录

WITH 语句(CTE)查询其实和上面的逻辑是一样的,只是在SQL语法结构上不同,创建了临时命名结果集ConsecutiveCTE,再标记了每个用户连续天数的记录命名为ranked表,最后通过rn=1只保留每个用户最大连续天数的记录。

相较而言CTE查询逻辑更简单,嵌套层级不深,且代码更具可读性。下面我们来介绍这个新函数。

WITH [recursive] cte_name [(column_alias1, column_alias2,...)] AS (
    -- CTE的查询语句,通常是一个SELECT查询
    SELECT_statement
)
-- 使用CTE的主查询语句
SELECT * FROM cte_name;

二、业务价值:最长登录天数的打开方式

SQL查询用户连续最长登录天数,其实是分析用户黏性的重要指标,主要体现在以下几方面:

到此这篇关于SQL用户连续登录最长天数的文章就介绍到这了,更多相关sql用户连续登录最长天数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文