#问答最大连续回答问题天数大于等于3天的用户及其等级#
某乎问答最大连续回答问题天数大于等于3天的用户及其对应等级
https://www.nowcoder.com/practice/e080f8a685bc4af3b47749ca3310f1fd
-- 统计最大连续回答问题的天数大于等于3天的用户及其等级(若有多条符合条件的数据,按author_id升序排序)
-- 1 利用窗口函数,将日期减去row_number,将连续日期置于同一日期,便于后续分组(结果作为t1)
# select
# answer_date,
# author_id,
# answer_date-row_number() over (partition by author_id order by answer_date) as tmp_date
# from answer_tb
# group by author_id, answer_date
-- 2 group by, having分组并筛选连续日期>=3的用户(结果作为t2)
# select
# author_id,
# count(*) days_cnt
# from t1
# group by tmp_date, author_id
# having count(*)>=3
-- 3 join合并,得出level
# select
# t2.author_id,
# author_level,
# days_cnt
# from t2 left join author_tb at on t2.author_id=at.author_id
-- 汇总
# select
# t2.author_id,
# author_level,
# days_cnt
# from (
# select
# author_id,
# count(*) days_cnt
# from (
# select
# answer_date,
# author_id,
# answer_date-row_number() over (partition by author_id order by answer_date) as tmp_date
# from answer_tb
# group by author_id, answer_date
# )t1
# group by tmp_date, author_id
# having count(*)>=3
# )t2 left join author_tb at on t2.author_id=at.author_id
-- 优化:由于author_level对于每个用户是固定且唯一的,故group by时加上author_level可在第二步直接提取author_level(前面忘了加order by,此处加上)
select
t1.author_id,
author_level,
count(*) days_cnt
from (
select
answer_date,
author_id,
answer_date-row_number() over (partition by author_id order by answer_date) as tmp_date
from answer_tb
group by author_id, answer_date
)t1 left join author_tb at on t1.author_id=at.author_id
group by tmp_date, author_id, author_level
having count(*)>=3
order by t1.author_id
查看1道真题和解析