如何用MySQL查询连续登录天数,Lead与Lag函数如何巧妙运用?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1043个文字,预计阅读时间需要5分钟。
核心思路是:
常见错误是忘记 ORDER BY login_date —— 窗口函数不指定排序,结果完全不可预测;还有人漏掉 PARTITION BY user_id,导致跨用户比较,数据全乱。
-
LAG(login_date, 1) OVER (PARTITION BY user_id ORDER BY login_date)是标准写法,第二个参数1表示取前 1 行(可省略,默认就是 1) - 注意
login_date必须是DATE类型,如果是DATETIME,得先DATE(login_date)去时分秒,否则同一天多次登录会被误判为“非连续” - 首次登录时
LAG返回NULL,需要用IS NULL单独处理,不能直接参与减法运算(否则整行变NULL)
怎么用 LEAD 判断连续段的结束位置
LEAD 和 LAG 是对称操作,但实战中更常用 LAG 做“向前比”,因为连续性天然依赖“上一天是否存在”。不过当你需要标记每段连续登录的终点(比如导出“某次连续登录共 5 天”),LEAD 就派上用场了:看下一天是否断开。
典型场景是生成连续区间:先用 LAG 标出每个登录日是否为连续段开头(即前一天不连续),再用 LEAD 标出是否为结尾(即后一天不连续)。
本文共计1043个文字,预计阅读时间需要5分钟。
核心思路是:
常见错误是忘记 ORDER BY login_date —— 窗口函数不指定排序,结果完全不可预测;还有人漏掉 PARTITION BY user_id,导致跨用户比较,数据全乱。
-
LAG(login_date, 1) OVER (PARTITION BY user_id ORDER BY login_date)是标准写法,第二个参数1表示取前 1 行(可省略,默认就是 1) - 注意
login_date必须是DATE类型,如果是DATETIME,得先DATE(login_date)去时分秒,否则同一天多次登录会被误判为“非连续” - 首次登录时
LAG返回NULL,需要用IS NULL单独处理,不能直接参与减法运算(否则整行变NULL)
怎么用 LEAD 判断连续段的结束位置
LEAD 和 LAG 是对称操作,但实战中更常用 LAG 做“向前比”,因为连续性天然依赖“上一天是否存在”。不过当你需要标记每段连续登录的终点(比如导出“某次连续登录共 5 天”),LEAD 就派上用场了:看下一天是否断开。
典型场景是生成连续区间:先用 LAG 标出每个登录日是否为连续段开头(即前一天不连续),再用 LEAD 标出是否为结尾(即后一天不连续)。

