1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| WITH user_logins AS ( SELECT userid, dt, ROW_NUMBER() OVER (PARTITION BY userid ORDER BY dt) AS row_num FROM usr_login ), login_streaks AS ( SELECT userid, dt, row_num, DATE_SUB(dt, INTERVAL row_num DAY) AS streak_start FROM user_logins ), grouped_streaks AS ( SELECT userid, MIN(dt) AS first_active_day, COUNT(*) AS streak_length FROM login_streaks GROUP BY userid, streak_start ) SELECT userid, first_active_day FROM grouped_streaks WHERE streak_length >= 3 ORDER BY userid, first_active_day;
|