+
95
-

回答

在 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。

这个查询将返回每个用户的连续签到最大天数,例如:

13
24
32

这个方法通过使用窗口函数和分组技巧,巧妙地计算了用户连续签到的最大天数。

网友回复

我知道答案,我要回答