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()分组聚合一次,即可得到“最大连续登录天数”。

京公网安备 11010502036488号