需求
假设有下列表(user_login),第一列为id,第二列为登陆时间(dt),该表记录了每个id的登陆时间
现在要统计指定7天内连续登录3天以上的用户,结果如下
解决方案
- 由于存在同一用户同一天内多次登陆的情况,因此第一步需要对id和登陆时间按date进行去重,即
SELECT DISTINCT
id,
date( dt ) AS dt
FROM
user_login
WHERE
dt BETWEEN '2022-10-06' AND '2022-10-12';
-
需要对连续登录进行判断,观察可以看到:如果按登录日期排序,并且使用登陆日期减去排序序号的话,连续登录的日期会得到相同结果
-
因此,最后再对id和d进行分组统计数量,再利用having筛选统计数量大于等于3的结果
SELECT
id, count( 1 ) AS '连续登录天数'
FROM
(
SELECT
id, DATE_SUB(dt, INTERVAL ROW_NUMBER() over (PARTITION BY id ORDER BY dt) DAY) AS d
FROM
( SELECT DISTINCT id, date( dt ) AS dt FROM user_login WHERE dt BETWEEN '2022-10-06' AND '2022-10-12' ) t_distinct ) t
GROUP BY
id, d
HAVING
`连续登录天数` >= 3;