1、根据数据的日期进行去重,得到数据(如果没有重复数据可以忽略)例:
select distinct l.time day, l.name from logs l
2、在第一步的基础上查询,使用rank() over () 函数根据名称分组,
根据日期排序(res1是上一步求出的数据) 例:
select t1.*,rank() over( partition by t1.name order by t1.day ) num from res1 t1
3、 根据上一步的求出来的结果,使用date_sub()函数 求出 日期和排序后值的差值 (res2是上一步求出的数据)例:
select r.*, date_sub(r.day, r.num) cha from res2 r
4、根据差值和名字进行分组 ,并用count()函数计算个数,个数即为该用户连续登录的天数 (res3是上一步求出的数据) 例:
select r.name, r.cha, count(*) cnt from res3 r group by r.name, r.cha having cnt >= 3
完整代码展示
SELECT
m3.NAME,
m3.cha,
count(*) cnt
FROM
(
SELECT
m2.*,
date_sub( m2.DAY, m2.num ) cha
FROM
(
SELECT
m1.*,
rank () over ( PARTITION BY m1.NAME ORDER BY m1.DAY ) num
FROM
( SELECT DISTINCT REPLACE ( m.date, '/', '-' ) DAY, m.NAME FROM movies m ) m1
) m2
) m3
GROUP BY
m3.cha,
m3.NAME
HAVING
cnt >=3