sql找出连续7天登陆,连续30天登陆的用户
封面图
•
2026-01-06
•
MySQL
285
0
0
0
要使用 SQL 找出**连续 7 天登录**或**连续 30 天登录**的用户,通常需要以下步骤: --- ## ✅ 假设数据结构 假设我们有如下表结构(以 `user_login` 表为例): ```sql CREATE TABLE user_login ( user_id INT, login_date DATE ); ``` 每条记录表示一个用户某一天的登录行为。 --- ## 🔍 问题目标 找出 **连续 7 天**、**连续 30 天**登录的用户。 --- ## 🧠 解题思路 ### 1. 对每个用户按日期排序 - 使用 `ROW_NUMBER()` 为每个用户的登录日期分配一个序号。 - 用当前登录日期减去这个序号,如果连续登录,则结果相同。 ### 2. 分组统计 - 根据上面的结果分组,统计连续天数。 - 如果某组的连续天数 ≥ 7 或 ≥ 30,则说明该用户满足条件。 --- ## 📌 SQL 查询示例 ### ✅ 连续 7 天登录的用户 ```sql WITH UserLoginWithRank AS ( SELECT user_id, login_date, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date) AS rn FROM user_login ), Grouped AS ( SELECT user_id, login_date, DATE_SUB(login_date, INTERVAL rn DAY) AS grp FROM UserLoginWithRank ) SELECT user_id FROM Grouped GROUP BY user_id, grp HAVING COUNT(*) >= 7; ``` --- ### ✅ 连续 30 天登录的用户 ```sql WITH UserLoginWithRank AS ( SELECT user_id, login_date, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date) AS rn FROM user_login ), Grouped AS ( SELECT user_id, login_date, DATE_SUB(login_date, INTERVAL rn DAY) AS grp FROM UserLoginWithRank ) SELECT user_id FROM Grouped GROUP BY user_id, grp HAVING COUNT(*) >= 30; ``` --- ## 📝 说明 - `DATE_SUB(login_date, INTERVAL rn DAY)` 是关键,它将连续的日期归为同一个组。 - 每个组内的 `COUNT(*)` 就是连续登录的天数。 - 如果某个用户在某个组中拥有至少 7/30 天的登录记录,就说明他连续登录了这么长时间。 --- ## 💡 注意事项 - 确保 `login_date` 是每天唯一的(即没有重复的日期),否则可能需要先去重。 - 如果你只关心“是否连续”,不关心具体哪几天,那么上述方法足够。 - 如果你需要返回具体的连续登录日期范围,可以进一步处理。 --- ## ✅ 示例数据 | user_id | login_date | |---------|------------| | 1 | 2025-04-01 | | 1 | 2025-04-02 | | 1 | 2025-04-03 | | 1 | 2025-04-04 | | 1 | 2025-04-05 | | 1 | 2025-04-06 | | 1 | 2025-04-07 | 对于用户 1,会返回 `user_id = 1` 作为连续 7 天登录的用户。 --- 如果你有数据库类型(如 MySQL、PostgreSQL、SQL Server 等),我可以提供更精确的语法。欢迎继续提问!
上一篇:
mysql 如何连接多个select?
下一篇:
MySQL排序窗口函数
标题录入,一次不能超过6条
留言
评论