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