怎样在SQL中使用LAG函数高效计算用户留存间隔

千雪姑娘_8150

千雪姑娘_8150

2026-09-16

986人浏览

原创

必须用lag(login_date) over (partition by user_id order by login_date)取前次登录日,配合timestampdiff(day, prev_login, login_date) = 1判断次日留存,分母须限定为观察期内新用户,并前置清洗脏数据。

怎样在sql中使用lag函数高效计算用户留存间隔

LAG必须配合PARTITION BY user_id和ORDER BY login_date

单独写 LAG(login_date) 不会报错,但结果完全不可用——它会把所有用户的登录时间混在一起排序,张三的下一次登录可能被填成李四的日期。MySQL 8.0+ 在严格模式下甚至直接拒绝执行。真正起作用的只有带明确分组和排序的组合:LAG(login_date) OVER (PARTITION BY user_id ORDER BY login_date)。如果 login_date 有秒级重复(比如埋点并发),建议追加主键或 id 到 ORDER BY 后,避免排序不稳定。

用DATEDIFF而非DATE_ADD判断“是否次日回来”

LAG() 只负责取值,不负责逻辑判断。常见错误是写成 WHERE next_login IS NOT NULL,这统计的是“有后续行为”,不是“次日就回来”。正确做法是计算自然天数差:

  • MySQL:用 TIMESTAMPDIFF(DAY, login_date, LAG(login_date) OVER (...)) = 1
  • 别用 DATE_ADD(login_date, INTERVAL 1 DAY) = prev_login——跨月时失效(如 1 月 31 日 +1 天 ≠ 2 月 1 日)
  • 也别用字符串截取或 DAYOFYEAR(),它们无法处理跨年、跨周偏移

分母必须限定为“首次登录落在观察期内”的用户

留存率的分母不是某天所有活跃用户,而是该周期内新用户。漏掉“首次”前提,老用户会被误计入,导致留存率被稀释。实操中要先锚定每个用户的首次登录日:

Multi-Brain Protocol
Multi-Brain Protocol

一款AI工具,主要用于在主代理响应前,并行运行Kimi K2.5和GPT 5.3 Codex,注入双方观点以增强认知多样性,适合需要提升相关任务效率的用户。

下载
  • MIN(login_date) OVER (PARTITION BY user_id) 算出 first_login
  • 再在外层筛选:WHERE first_login BETWEEN '2026-08-01' AND '2026-08-07'
  • 原始数据含脏数据(如 '0000-00-00' 或 NULL)时,务必前置过滤:AND login_date >= '2026-01-01' AND login_date IS NOT NULL

LAG默认返回NULL,别让它悄悄影响聚合结果

当用户只登录一次,LAG(login_date) 返回 NULL。如果后续直接参与 COUNT(*) 或除法,会导致分母变小、比率虚高。不同数据库对 NULL 的处理不一致:PostgreSQL 中 day_diff = 1 对 NULL 返回 NULL(等效 false),而某些 Hive 版本会跳过整行。稳妥做法是显式控制:

  • MySQL 用 IFNULL(LAG(login_date), '1970-01-01')
  • BigQuery 可用第三个参数设默认值:LAG(login_date, 1, '1970-01-01')
  • 更推荐统一用 COALESCE(TIMESTAMPDIFF(...), -999),再用 CASE WHEN day_diff IN (1, 7) THEN ... 控制逻辑分支

真正难的不是写对 LAG(),而是意识到它只解决“取值”问题;间隔判断、分母界定、NULL 安全、日期精度——每个环节都得手动补位,少一个,结果就偏了。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

3683

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

771

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

949

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

5441

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2443

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5420

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

7041

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

950

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

852

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.1万人学习