在 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 |
这个方法通过使用窗口函数和分组技巧,巧妙地计算了用户连续签到的最大天数。
网友回复
腾讯混元模型广场里都是混元模型的垂直小模型,如何api调用?
为啥所有的照片分辨率提升工具都会修改照片上的图案细节?
js如何在浏览器中将webm视频的声音分离为单独音频?
微信小程序如何播放第三方域名url的mp4视频?
ai多模态大模型能实时识别视频中的手语为文字吗?
如何远程调试别人的chrome浏览器获取调试信息?
为啥js打开新网页window.open设置窗口宽高无效?
浏览器中js的navigator.mediaDevices.getDisplayMedia屏幕录像无法录制SpeechSynthesisUtterance产生的说话声音?
js中mediaRecorder如何录制window.speechSynthesis声音音频并下载?
python如何直接获取抖音短视频的音频文件url?