在 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 |
这个方法通过使用窗口函数和分组技巧,巧妙地计算了用户连续签到的最大天数。
网友回复
软件工程师的工作内容将由敲代码转变成使用ai来解决现实世界的问题?
claude skills如何本地自动剪辑生成视频?
物理ai是2026年的趋势吗?
ai能对老相机拍摄的底片进行修复成彩色照片吗?
PlayCanvas能在浏览器中交互展示4dgs高斯泼溅文件吗?
jpeg xl格式图片有啥优势?
glb三维模型有几种方式可以降低体积大小减少精度?
如何使用python PyTorch自己训练一个迷你版本的本地chatgpt聊天机器人?
three如何对三维glb模型实现精度降级内部结构清除只留外壳体积减小?
有没有免费根据图片音频视频素材按照文字提示自动剪辑修改图片音频视频素材生成网站的ai工具?


