连续问题
问题一
算过去30天有哪些用户是连续7天登录我们APP的,如何写SQL
思路:用rank算出连续编号,然后用日期减去rank编号差值求解
SELECT DISTINCT user_id
FROM (
SELECT user_id,
login_date,
date_sub(login_date, interval rank() over (partition by user_id order by login_date) day) as grp
FROM logins
WHERE login_date > current_date - interval 30 day
) t
GROUP BY user_id, grp
HAVING count(*) >= 7
问题二
如下数据为蚂蚁森林中用户领取的减少碳排放量
id dt lowcarbon
1001 2021-12-12 123
1002 2021-12-12 45
1001 2021-12-13 43
1001 2021-12-13 45
1001 2021-12-13 23
1002 2021-12-14 45
1001 2021-12-14 230
1002 2021-12-15 45
1001 2021-12-15 23
.......
找出连续3天及以上每天减少碳排放量在100以上的用户
思路一、日期减去rank排名再分组
-- 1) 按照用户ID及时间字段分组,计算每个用户单日减少的碳排放量
select id,
dt,
sum(lowcarbon) lowcarbon
from test1
group by
id,dt
having lowcarbon>100; 记为 t1
得到:
1001 2021-12-12 123
1001 2021-12-13 111
1001 2021-12-14 230
-- 2) 按照用户分组,同时按照时间排序,计算每条数据的Rank值
select id,
dt,
lowcarbon,
rank() over(partition by id order by dt) rk
from t1; 记为 t2
得到:
1001 2021-12-12 123 1
1001 2021-12-13 111 2
1001 2021-12-14 230 3
-- 3) 将每行数据中的日期减去Rank值
select id,
dt,
lowcarbon,
date_sub(dt,rk) flag
from t2; 记为 t3
得到:
1001 2021-12-12 123 2021-12-11
1001 2021-12-13 111 2021-12-11
1001 2021-12-14 230 2021-12-11
-- 4) 按照用户及Flag分组,求每个组有多少条数据,并找出大于等于3条的数据
select id,
flag,
count(*) ct
from t3
group