WITH t1 AS ( SELECT user_id, sales_date, ROW_NUMBER() OVER ( PARTITION BY user_id ORDER BY sales_date ) AS rk FROM sales_tb ), t2 AS ( SELECT user_id, sales_date - rk AS date_sub FROM t1 ) SELECT user_id, days_count FROM ( SELECT user_id, date_sub, COUNT(*) AS days_count FROM t2 GROUP BY user_id, date_sub HAVING COUNT(*) >= 2 ) b ORDER BY user_id
非常典型的连续登录问题。先使用窗口函数得到每个用户登录时间排序的序号,再使用 登录日期-序号,如果存在连续登录的情况,则连续登录的这几天该差值是相同的。最后只需按照该差值分组聚合即可得到连续登录的天数。
另:如果存在连续登录之间有间隔的情况,可以再使用MAX()分组聚合一次,即可得到“最大连续登录天数”。