在SQL中解决最长连续登录天数的问题,通常可以通过使用窗口函数或递归查询来解决。下面是常见的思路和解决方法:
假设表结构
假设你的表名为user_logins,并包含以下字段:
user_id: 用户的唯一标识
login_date: 登录日期(日期类型)
数据示例:
user_id login_date
1 2023-10-01
1 2023-10-02
1 2023-10-04
2 2023-10-01
2 2023-10-03
... ...
解决思路
计算日期差:给每条记录分配一个组号,使连续的日期在同一组内。通过 ROW_NUMBER() 窗口函数计算出相对日期差。
分组求最长连续天数:根据组号计算每个连续组的天数,最终找到最长的一组。
示例查询
下面的SQL示例适用于MySQL 8.0及以上,或者其他支持窗口函数的数据库:
WITH login_sequences AS (
SELECT
user_id,
login_date,
ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY login_date) -
DATEDIFF(login_date, '2000-01-01') AS group_id
FROM
user_logins
),
grouped_logins AS (
SELECT
user_id,
MIN(login_date) AS start_date,
MAX(login_date) AS end_date,
COUNT(*) AS consecutive_days
FROM
login_sequences
GROUP BY
user_id, group_id
)
SELECT
user_id,
MAX(consecutive_days) AS max_consecutive_days
FROM
grouped_logins
GROUP BY
user_id;
查询解释
- login_sequences:计算 ROW_NUMBER() 并用 DATEDIFF() 减去一个固定日期(如2000-01-01),得到组号。组号相同的行即为连续登录的日期。
- grouped_logins:按组号分组,得到每组的开始和结束日期,并计算连续天数。
- 最终结果:找到每个用户的最大连续登录天数。