SQL 如何高效计算“连续活跃天数”或“连续登录”-SQL

用ROW_NUMBER()配合日期差分组的核心是将连续日期映射为同一组号:按user_id和login_date排序后,用login_date减去行号,结果相同即属同一连续段;需注意分区、排序字段、数据库兼容性及索引优化。

用 ROW_NUMBER() 配合日期差做分组

核心思路是把连续日期映射成同一组号:对用户按登录日期排序,用 login_date 减去 ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date),相同结果即为同一连续段。

注意必须用日期类型直接相减(如 PostgreSQL/MySQL 8.0+ 支持 DATE - INTERVAL '1 day' * rn,SQL Server 用 DATEADD(day, -rn, login_date)),不能转字符串或时间戳再算,否则会丢失精度或报错。

常见错误是漏掉 PARTITION BY user_id,导致全表混排,结果完全错乱;或者 ORDER BY 用了 login_time 而非 login_date,同一天多次登录会被拆成多段。

MySQL 5.7 没有窗口函数怎么办

得用变量模拟 ROW_NUMBER(),但要注意执行顺序不可靠——必须用子查询先按 user_id, login_date 排序,再在外层赋值。

SELECT user_id, login_date,
       @rn := IF(@prev = user_id, @rn + 1, 1) AS rn,
       @prev := user_id
FROM (SELECT user_id, DATE(login_time) AS login_date
      FROM logins
      ORDER BY user_id, login_date) t,
     (SELECT @rn := 0, @prev := '') init

变量方式在 JOIN 或子查询嵌套过深时容易失效;另外 DATE(login_time) 必须提前归一化,否则凌晨跨天日志可能被误判为不连续。

如何查“当前连续活跃了多少天”

不是找历史最长,而是算截止今天还在延续的那段。关键在于过滤出“最后登录日 = 今天”的用户,再反向推最近断点。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » SQL 如何高效计算“连续活跃天数”或“连续登录”-SQL
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4008437+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4008437+
  • 本周更新: 0+
  • 最后更新: 2026-03-16