在a表中有id和date两列,记录用户当天是否签到,想查询出哪些用户连续签到了3天(或连续签到更多天,是连续签到)

(1) 先开窗,排个序:
sql
select user_id, login_time,
row_number() over(partition by user_id order by login_time) num
from login_log;
开完窗的结果如下:

(2) 利用等差数列的特性,如果是连续登录,login_time - num 则相等,因此可以这样写:
sql
select t.user_id,
t.login_time,
date_sub(login_time, INTERVAL t.num DAY) date_rslt
from
(
select user_id, login_time,
row_number() over(partition by user_id order by login_time) num
from login_log
) t;
注:INTERVAL 关键字可以用于计算时间间隔, date_sub(login_time, INTERVAL t.num DAY)表示登录时间减去 num 天; 若 DAY 改成 HOUR 表示减去 num 小时。
以上 SQL 执行后得到:

(3)分组后可获得结果:
sql
select a.user_id,
a.date_rslt,
count(1) as cnt
from(
select
t.user_id,
t.login_time,
date_sub(login_time, INTERVAL t.num DAY) date_rslt
from
(
select user_id,
login_time,
row_number() over(partition by user_id order by login_time) num
from login_log
) t
) a
group by a.user_id, a.date_rslt;