样本数据导入:
drop table if exists user_login;
create table user_login
( `user_id` bigint
,login_date string
)
;
insert into table user_login
values
(1,'2025-04-01')
,(1,'2025-04-02')
,(1,'2025-04-03')
,(1,'2025-04-05')
,(1,'2025-04-06')
,(2,'2025-04-01')
,(2,'2025-04-02')
;在这里插入代码片
id | login_date |
---|---|
1 | 2025-04-01 |
1 | 2025-04-02 |
1 | 2025-04-03 |
1 | 2025-04-05 |
1 | 2025-04-06 |
2 | 2025-04-01 |
2 | 2025-04-02 |
sql
WITH ranked_logins AS (
SELECT
user_id,
login_date,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date) AS rn
FROM (
SELECT DISTINCT user_id, login_date
FROM user_login
) AS distinct_logins
),
grouped_logins AS (
SELECT
user_id,
login_date,
rn,
DATE_SUB(login_date,rn) AS grp
FROM ranked_logins
),
streaks AS (
SELECT
user_id,
grp,
COUNT(*) AS streak_length
FROM grouped_logins
GROUP BY user_id, grp
)
SELECT
user_id,
MAX(streak_length) AS max_streak
FROM streaks
GROUP BY user_id;