SQL 连续问题求解
- 找出连续7天登陆的用户
该问题可衍生解决如下常见的业务场景:
- 求出连续登录7天的用户/用户数
- 求出连续充电次数大于等于12次的用户数
- 求出连续3年获得冠军的选手
- ......
步骤1:去重。每个用户每天只保留一次登录记录
select distinct user_id, date from input
步骤2:开窗函数。对每一个客户,按照时间进行排序
select *, row_number() over (partition by user_id order by date) as `rank` from input
步骤3:计算date-rank的日期
select *, date_sub(date, rank) as `temp_date` from input
步骤4:以客户和 temp_date
字段为主键进行分组,计算条目数,条目数大于等于7的,即为连续登录7天
select user_id, temp_date,count(*) from input
group by user_id, temp_date
having count(*) >= 7
综上:
select user_id, temp_date,count(*)
from (
-- 计算基准时间
select *, date_sub(date, rank) as `temp_date`
from (
-- 排序
select *, row_number() over (partition by user_id order by date) as `rank`
from (
-- 去重
select distinct user_id, date from input
)
)
)
group by user_id, temp_date
having count(*) >= 7
- 最大连续天数的变形问题 。求连续点击三次的用户数,中间不能有别人的点击
select user_id, diff, count(*)
from (
select *, (rank1-rank2) as `diff`
from (
select *
, row_number() over (order by date ) as `rank1`
, row_number() over (partition by user_id order by date ) as `rank2`
from input
)
)
group by user_id, diff
having count(*) >= 3

- 电商公司用户访问时间数据,某个用户连续的访问记录如果时间间隔小于 60 秒,则分为同一个组。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义