在 MySQL 中,要获取用户连续签到的最大天数,可以通过使用窗口函数和一些巧妙的查询来实现。这里,我们假设有一个签到表 user_signins,包含以下字段:
user_id: 用户IDsignin_date: 签到日期我们需要通过 SQL 查询获取每个用户的连续签到的最大天数。可以按照以下步骤来实现:
创建测试数据:
CREATE TABLE user_signins ( user_id INT, signin_date DATE ); INSERT INTO user_signins (user_id, signin_date) VALUES (1, '2023-06-01'), (1, '2023-06-02'), (1, '2023-06-03'), (1, '2023-06-05'), (2, '2023-06-01'), (2, '2023-06-03'), (2, '2023-06-04'), (2, '2023-06-05'), (2, '2023-06-06'), (3, '2023-06-01'), (3, '2023-06-02'), (3, '2023-06-04');
查询用户连续签到的最大天数:
使用窗口函数 LAG 和 SUM 来计算每个签到日期是否是连续的。计算每个用户的连续签到天数,并获取最大值。WITH consecutive_days AS ( SELECT user_id, signin_date, signin_date - INTERVAL ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY signin_date) DAY AS group_id FROM user_signins ), streaks AS ( SELECT user_id, COUNT(*) AS streak_length FROM consecutive_days GROUP BY user_id, group_id ) SELECT user_id, MAX(streak_length) AS max_streak FROM streaks GROUP BY user_id;解释
consecutive_days CTE:
使用窗口函数 ROW_NUMBER() 来为每个用户的签到日期分配一个连续的序号。通过计算 signin_date - INTERVAL ROW_NUMBER() DAY 创建一个虚拟的组 ID group_id,同一连续签到组内的记录具有相同的 group_id。streaks CTE:
按照 user_id 和 group_id 分组,计算每个组内的记录数,即每个用户的连续签到天数 streak_length。最终查询:
按照 user_id 分组,获取每个用户的最大连续签到天数 max_streak。这个查询将返回每个用户的连续签到最大天数,例如:
1 | 3 |
2 | 4 |
3 | 2 |
这个方法通过使用窗口函数和分组技巧,巧妙地计算了用户连续签到的最大天数。
网友回复