以下是牛客大厂真题篇:包括百度、滴滴、抖音、京东、牛客、淘宝、知乎等
百度
2021年11月每天的人均浏览文章时长
2021年11月每天的人均浏览文章时长牛客题霸牛客网 (nowcoder.com)
问题:
统计2021年11月每天的人均浏览文章时长(秒数),结果保留1位小数,并按时长由短到长排序。
题目分析:
2021年11月开始:date_format(in_time,"%Y-%m") = '2021-11'
每天的人均浏览文章时长
文章ID = 0表示用户在浏览非文章内容,要过滤掉
GROUP BY dt:同一天的记录聚合在一起
一个用户一天内可能浏览几个文章内容(留下几行数据,但不对应成多人),故要过滤distinct uid
保留一位小数,ROUND(,1)
ORDER BY avg_viiew_len_sec:按时长升序
SELECT date(in_time) dt,
ROUND(sum(
TIMESTAMPDIFF(SECOND,in_time,out_time)) /
count(distinct uid)
,1
) avg_viiew_len_sec
FROM tb_user_log
WHERE date_format(in_time,"%Y-%m") = '2021-11' and artical_id != 0
GROUP BY dt
ORDER BY avg_viiew_len_sec
每篇文章同一时刻最大的在看人数
每篇文章同一时刻最大在看人数牛客题霸牛客网 (nowcoder.com)
详细解答:利用SUM窗口函数找到同一时刻内的最大计数_牛客博客 (nowcoder.net)
SELECT
artical_id,
MAX(instant_viewer_cnt) max_uv
FROM (SELECT
artical_id,
SUM(diff) OVER(PARTITION BY artical_id ORDER BY dt,diff DESC) instant_viewer_cnt
FROM(SELECT
artical_id,in_time dt,1 diff
FROM tb_user_log
WHERE artical_id != 0
UNION ALL
SELECT
artical_id,out_time dt,-1 diff
FROM tb_user_log
WHERE artical_id != 0) t1
) t2
GROUP BY artical_id
ORDER BY max_uv DESC
2021年11月每天新用户的次日留存率
2021年11月每天新用户的次日留存率牛客题霸牛客网 (nowcoder.com)
解析:题解 | #2021年11月每天新用户的次日留存率#_牛客博客 (nowcoder.net)
WITH t1 AS(
SELECT DISTINCT uid,DATE(in_time) AS dt FROM tb_user_log
UNION
SELECT DISTINCT uid,DATE(out_time) AS dt FROM tb_user_log
) # 用户活跃表
SELECT dt,
ROUND(SUM(
CASE WHEN
(uid,dt) IN (SELECT uid,date_add(dt,INTERVAL -1 DAY) FROM t1) AND
(uid,dt) IN (SELECT uid,MIN(dt) FROM t1 GROUP BY uid)
THEN 1 ELSE 0 END
) /
SUM(
CASE WHEN
(uid,dt) IN (SELECT uid,MIN(dt) FROM t1 GROUP BY uid)
THEN 1 ELSE 0 END
)
,2) AS uv_left_rate
FROM t1
WHERE DATE_FORMAT(dt,'%Y-%m') = '2021-11'
GROUP BY dt
HAVING uv_left_rate is not null
ORDER BY dt
统计活跃间隔对用户分级结果
统计活跃间隔对用户分级结果牛客题霸牛客网 (nowcoder.com)
SELECT user_grade,ROUND(COUNT(uid) / MAX(user_cnt),2) as ratio
FROM(
SELECT uid,user_cnt,
CASE
WHEN last_dt_diff >= 30 THEN "流失用户"
WHEN last_dt_diff >= 7 THEN "沉睡用户"
WHEN first_dt_diff < 7 THEN "新晋用户"
ELSE "忠实用户"
END as user_grade
FROM(
SELECT uid,user_cnt,
TIMESTAMPDIFF(DAY,first_dt,cur_dt) as first_dt_diff,
TIMESTAMPDIFF(DAY,last_dt,cur_dt) as last_dt_diff
FROM (
SELECT uid,
MIN(DATE(in_time)) as first_dt,
MAX(DATE(out_time)) as last_dt
FROM tb_user_log
GROUP BY uid
) as t_uid_first_last
LEFT JOIN(
SELECT MAX(DATE(out_time)) as cur_dt,
COUNT(DISTINCT uid) as user_cnt
FROM tb_user_log
) as t_overall_info ON 1
) as t_user_info
) as t_user_grade
GROUP BY user_grade
ORDER BY ratio DESC;
每天的日活数及新用户占比
每天的日活数及新用户占比牛客题霸牛客网 (nowcoder.com)
解析:题解 | #每天的日活数及新用户占比#_牛客博客 (nowcoder.net)
WITH t1 AS(
SELECT DISTINCT uid,DATE(in_time) dt,MIN(DATE(in_time))OVER(PARTITION BY uid) new_dt FROM tb_user_log
UNION
SELECT DISTINCT uid,DATE(out_time) dt,MIN(DATE(in_time))OVER(PARTITION BY uid) new_dt FROM tb_user_log
)
SELECT dt,COUNT(1) dau,ROUND(SUM(IF(dt=new_dt,1,0))/COUNT(1),2) uv_new_ratio
FROM t1 GROUP BY dt ORDER BY dt ASC;
连续签到领金币
解析:题解 | #连续签到领金币#_牛客博客 (nowcoder.net)
select t2.uid,DATE_FORMAT(t2.dt,'%Y%m') month,sum(t2.coin) coin
FROM(select *,
row_number() over(PARTITION BY t1.uid,t1.dt2 order by t1.dt) ranking2,
case
when row_number() over(PARTITION BY t1.uid,t1.dt2 order by t1.dt)%7=3 then 3
when row_number() over(PARTITION BY t1.uid,t1.dt2 order by t1.dt)%7=0 then 7
else 1 end coin
FROM(SELECT DISTINCT uid,date(in_time) dt,
row_number() over (partition by uid order by date(in_time)) ranking,
date(in_time)-(row_number() over (partition by uid order by date(in_time))) dt2
FROM tb_user_log
where date(in_time) between '2021-07-07' and '2021-10-31'
and artical_id=0 and sign_in=1)t1
) t2
group by t2.uid,DATE_FORMAT(t2.dt,'%Y%m')
order by t2.uid,DATE_FORMAT(t2.dt,'%Y%m')
滴滴
2021年国企在北京接单3次及以上的司机统计信息
2021年国庆在北京接单3次及以上的司机统计信息牛客题霸牛客网 (nowcoder.com)
解题分析:题解 | #SQL 19.2021年国庆在北京接单3次及以上的司机统计信息#_牛客博客 (nowcoder.net)
SELECT "北京" city,
ROUND(AVG(order_num),3) avg_order_num,
ROUND(AVG(income),3) avg_income
FROM (
SELECT driver_id,
COUNT(order_id) order_num,
SUM(fare) income
FROM tb_get_car_order
JOIN tb_get_car_record USING(order_id)
WHERE city = "北京" and DATE(order_time) BETWEEN '20211001' AND '20211007'
GROUP BY driver_id
HAVING COUNT(order_id) >= 3
) t_driver_info
有取消订单记录的司机平均分
有取消订单记录的司机平均评分牛客题霸牛客网 (nowcoder.com)
解题分析:题解 | #SQL 20.有取消订单记录的司机平均评分#_牛客博客 (nowcoder.net)
SELECT IFNULL(driver_id,"总体") driver_id,
ROUND(AVG(grade),1) avg_grade
FROM tb_get_car_order
WHERE driver_id in (
SELECT driver_id
FROM tb_get_car_order
WHERE DATE_FORMAT(order_time,"%Y-%m") = '2021-10' AND ISNULL(fare)
) AND NOT ISNULL(grade)
GROUP BY driver_id
WITH ROLLUP
每个城市中评分最高的司机信息
每个城市中评分最高的司机信息牛客题霸牛客网 (nowcoder.com)
解题分析:题解 | #SQL 21.每个城市中评分最高的司机信息#_牛客博客 (nowcoder.net)
SELECT city,driver_id,
avg_grade,avg_order_num,avg_mileage
FROM(SELECT city,driver_id,
ROUND(avg_grade,1) avg_grade,
ROUND(order_num / work_days,1) avg_order_num,
ROUND(total_mileage / work_days,3) avg_mileage,
RANK() OVER(PARTITION BY city ORDER BY avg_grade DESC) as rk
FROM(SELECT driver_id,city,
AVG(grade) avg_grade,
COUNT(DISTINCT DATE(order_time)) work_days,
COUNT(order_time) order_num,
SUM(mileage) total_mileage
FROM tb_get_car_record
JOIN tb_get_car_order USING(order_id)
GROUP BY driver_id,city
) t_driver_info
) t_driver_rk
WHERE rk = 1
ORDER BY avg_order_num
国企期间近7日日均取消订单量
国庆期间近7日日均取消订单量牛客题霸牛客网 (nowcoder.com)
解题分析:题解 | #国庆期间近7日日均取消订单量#_牛客博客 (nowcoder.net)
SELECT *
FROM(SELECT dt,
ROUND(
SUM(daily_complete) OVER(ORDER BY dt rows 6 preceding)/7
,2) finish_num_7d,
ROUND(
SUM(daily_cancel) OVER(ORDER BY dt rows 6 preceding)/7
,2) cancel_num_7d
FROM(SELECT date(event_time) dt,
SUM(
CASE WHEN ISNULL(fare) = FALSE THEN 1 ELSE 0 END
) daily_complete,
SUM(
CASE WHEN ISNULL(fare) = TRUE THEN 1 ELSE 0 END
) daily_cancel
FROM tb_get_car_record
INNER JOIN tb_get_car_order USING(order_id)
WHERE date(event_time) BETWEEN '20210925' AND '20211003'
GROUP BY dt
) temp1
) temp2
WHERE dt BETWEEN '2021-10-01' AND '2021-10-03'
抖音
各个视频的平均完播率
各个视频的平均完播率牛客题霸牛客网 (nowcoder.com)
SELECT
a.video_id,
ROUND(
AVG(IF(TIMESTAMPDIFF(second,start_time,end_time) >= duration,1,0)),
3
) as avg_comp_play_rate
FROM
tb_user_video_log a
LEFT JOIN tb_video_info b on a.video_id = b.video_id
WHERE
year (start_time) = 2021
GROUP BY
a.video_id
ORDER BY
avg_comp_play_rate DESC;
平均播放进度大于60%的视频类别
平均播放进度大于60%的视频类别牛客题霸牛客网 (nowcoder.com)
SELECT tag, CONCAT(avg_play_progress, "%") as avg_play_progress
FROM (
SELECT tag,
ROUND(AVG(
IF(TIMESTAMPDIFF(SECOND, start_time, end_time) > duration, 1,
TIMESTAMPDIFF(SECOND, start_time, end_time) / duration)
) * 100, 2) as avg_play_progress
FROM tb_user_video_log a
Left JOIN tb_video_info b
ON a.video_id = b.video_id
GROUP BY tag
HAVING avg_play_progress > 60
ORDER BY avg_play_progress DESC
) as t_progress;
每类视频近一个月的转发量
SELECT
b.tag,
SUM(if_retweet) retweet_cnt,
ROUND(SUM(if_retweet) / COUNT(*), 3) retweet_rate
FROM
tb_user_video_log a
LEFT JOIN tb_video_info b ON a.video_id = b.video_id
WHERE
DATEDIFF (
DATE (
(
select
max(start_time)
FROM
tb_user_video_log
)
),
DATE (a.start_time)
) <= 29
GROUP BY
b.tag
ORDER BY
retweet_rate desc
每个创作者每月的涨粉率及截至当前的总粉丝量
每个创作者每月的涨粉率及截止当前的总粉丝量牛客题霸牛客网 (nowcoder.com)
SELECT
author,
date_format(start_time,'%Y-%m') month,
round(
sum(case when if_follow=1 then 1
when if_follow=2 then -1
else 0 end) / count(author)
,3) fans_growth_rate,
sum(
sum(
case when if_follow = 1 then 1
when if_follow = 2 then -1
else 0 end
)
) over(partition by author order by date_format(start_time,'%Y-%m')) total_fans
FROM tb_user_video_log a
LEFT JOIN tb_video_info b
ON a.video_id = b.video_id
WHERE year(start_time) = 2021
group by author,month
order by author,total_fans
国庆期间每类视频点赞量和转发量
国庆期间每类视频点赞量和转发量牛客题霸牛客网 (nowcoder.com)
WITH
t1 AS (
SELECT
tag,
DATE_FORMAT (start_time, '%Y-%m-%d') dt,
SUM(SUM(if_like)) OVER (
PARTITION BY tag
ORDER BY DATE_FORMAT (start_time, '%Y-%m-%d') rows 6 preceding
) AS sum_like_cnt_7d,
MAX(SUM(if_retweet)) OVER (
PARTITION BY tag
ORDER BY DATE_FORMAT (start_time, '%Y-%m-%d') rows 6 preceding
) AS max_retweet_cnt_7d
FROM
tb_user_video_log
JOIN tb_video_info USING (video_id)
WHERE
DATEDIFF (
'2021-10-03',DATE_FORMAT (start_time, '%Y-%m-%d')
) < 9
GROUP BY dt,tag
)
SELECT *
FROM t1
WHERE dt BETWEEN '2021-10-01' AND '2021-10-03'
ORDER BY
tag DESC,
dt ASC;
近一个月发布的视频中热度最高的Top3视频
近一个月发布的视频中热度最高的top3视频牛客题霸牛客网 (nowcoder.com)
SELECT video_id,
ROUND((100 * comp_play_rate + 5 * like_cnt + 3 * comment_cnt + 2 * retweet_cnt)
/ (TIMESTAMPDIFF(DAY, recently_end_date, cur_date) + 1), 0) as hot_index
FROM (
SELECT video_id,
AVG(IF(
TIMESTAMPDIFF(SECOND, start_time, end_time)>=duration, 1, 0
)) as comp_play_rate,
SUM(if_like) as like_cnt,
COUNT(comment_id) as comment_cnt,
SUM(if_retweet) as retweet_cnt,
MAX(DATE(end_time)) as recently_end_date, -- 最近被播放日期
MAX(DATE(release_time)) as release_date, -- 发布日期
MAX(cur_date) as cur_date -- 非分组列,加MAX避免语法错误
FROM tb_user_video_log
JOIN tb_video_info USING(video_id)
LEFT JOIN (
SELECT MAX(DATE(end_time)) as cur_date
FROM tb_user_video_log
) as t_max_date ON 1
GROUP BY video_id
HAVING TIMESTAMPDIFF(DAY, release_date, cur_date) < 30
) as t_video_info
ORDER BY hot_index DESC
LIMIT 3;
京东
计算商城中2021年每月的GMV
计算商城中2021年每月的GMV牛客题霸牛客网 (nowcoder.com)
SELECT date_format(event_time,"%Y-%m") month,
ROUND(SUM(total_amount),0) GMV
FROM tb_order_overall
WHERE year(event_time) = 2021 AND status != 2
GROUP BY month
HAVING GMV > 100000
ORDER BY GMV
统计2021年10月每个退货率不大于0.5的商品各项指标
统计2021年10月每个退货率不大于0.5的商品各项指标牛客题霸牛客网 (nowcoder.com)
select product_id, round(click_cnt/show_cnt, 3) as ctr,
round(IF(click_cnt>0, cart_cnt/click_cnt, 0), 3) as cart_rate,
round(IF(cart_cnt>0, payment_cnt/cart_cnt, 0), 3) as payment_rate,
round(IF(payment_cnt>0, refund_cnt/payment_cnt, 0), 3) as refund_rate
from (
select product_id, COUNT(1) as show_cnt,
sum(if_click) as click_cnt,
sum(if_cart) as cart_cnt,
sum(if_payment) as payment_cnt,
sum(if_refund) as refund_cnt
from tb_user_event
where DATE_FORMAT(event_time, '%Y%m') = '202110'
group by product_id
) as t_product_index_cnt
where payment_cnt = 0 or refund_cnt/payment_cnt <= 0.5
order by product_id;
某店铺的各商品毛利率及店铺整体毛利率
某店铺的各商品毛利率及店铺整体毛利率牛客题霸牛客网 (nowcoder.com)
解题分析:题解 | #某店铺的各商品毛利率及店铺整体毛利率#_牛客博客 (nowcoder.net)
with t as(
select p.product_id, p.in_price,d.price,d.cnt
from tb_order_overall o
left join tb_order_detail d
on o.order_id = d.order_id
left join tb_product_info p
on p.product_id = d.product_id
where o.status = 1 and date(o.event_time)>='2021-10-01' and p.shop_id = 901
)
select '店铺汇总' as product_id,
concat(round((1-sum(in_price*cnt)/sum(price*cnt))*100,1),'%') as profit_rate
from t
union
select *
from(
select product_id,
concat(round((1-sum(in_price*cnt)/sum(price*cnt))*100,1),'%') as profit_rate
from t
group by product_id
having profit_rate>24.9
order by product_id
) t2
;
零食类商品中复购率top3高的商品
SELECT product_id,
ROUND(SUM(repurchase) / COUNT(repurchase), 3) as repurchase_rate
FROM (
SELECT uid, product_id, IF(COUNT(event_time)>1, 1, 0) as repurchase
FROM tb_order_detail
JOIN tb_order_overall USING(order_id)
JOIN tb_product_info USING(product_id)
WHERE tag="零食" AND event_time >= (
SELECT DATE_SUB(MAX(event_time), INTERVAL 89 DAY)
FROM tb_order_overall
)
GROUP BY uid, product_id
) as t_uid_product_info
GROUP BY product_id
ORDER BY repurchase_rate DESC, product_id
LIMIT 3;
牛客
直播转换率
SELECT c.course_id,course_name,
ROUND(SUM(if_sign) * 100 / SUM(if_vw), 2) 'sign_rate(%)'
FROM course_tb c
JOIN behavior_tb b USING(course_id)
GROUP BY c.course_id,course_name
ORDER BY c.course_id
直播开始时各直播间在线人数
牛客直播开始时各直播间在线人数牛客题霸牛客网 (nowcoder.com)
SELECT course_id,course_name,
COUNT(DISTINCT user_id) online_num
FROM course_tb
JOIN attend_tb USING(course_id)
WHERE '19:00' BETWEEN DATE_FORMAT(in_datetime,'%H:%i') and DATE_FORMAT(out_datetime,'%H:%i')
GROUP BY course_id,course_name
ORDER BY course_id
直播各科目平均观看时长
牛客直播各科目平均观看时长牛客题霸牛客网 (nowcoder.com)
-- 小明在A课程总共看了50分钟;在B课程总共看了60分钟,在C课程总共看了55分钟
-- 小红在A课程总共看了45分钟;在B课程总共看了40分钟
-- A课程的平均观看时长为:(50 + 45) / 2 = 47.5;
-- B课程的平均观看时长为:(60 + 40) / 2 = 50;
-- C课程的平均观看时长为:55
WITH t1 as (
SELECT user_id,
course_name,
SUM(TIMESTAMPDIFF(Minute,in_datetime,out_datetime)) len
FROM course_tb
JOIN attend_tb USING(course_id)
GROUP BY user_id,course_name
)
SELECT course_name,
ROUND(
SUM (len) * 100 / COUNT(user_id)
,2) avg_Len
FROM t1
GROUP BY course_name
ORDER BY avg_Len DESC
----------------------------这题意实在出的有很大问题----------------------------------
SELECT
course_name,
ROUND(
AVG(TIMESTAMPDIFF (MINUTE, in_datetime, out_datetime)),
2
) avg_Len
FROM
attend_tb
JOIN course_tb USING (course_id)
GROUP BY
course_name
ORDER BY
avg_Len DESC;
直播各科目出勤率
牛客直播各科目出勤率牛客题霸牛客网 (nowcoder.com)
题目分析:题解 | #牛客直播各科目出勤率#_牛客博客 (nowcoder.net)
SELECT
course_id,
course_name,
ROUND(attend_cnt * 100 / application_cnt, 2) 'attend_rate(%)'
FROM
(
SELECT course_id,
COUNT(DISTINCT user_id) application_cnt
FROM behavior_tb
WHERE if_sign = 1
GROUP BY course_id
) AS t1
JOIN (
SELECT course_id,
COUNT(DISTINCT user_id) attend_cnt
FROM attend_tb
WHERE TIMESTAMPDIFF (minute, in_datetime, out_datetime) >= 10
GROUP BY course_id
) AS t2 USING (course_id)
JOIN (course_tb) USING (course_id)
ORDER BY course_id;
直播各科目同时在线人数
牛客直播各科目同时在线人数牛客题霸牛客网 (nowcoder.com)
题目分析:题解 | #牛客直播各科目同时在线人数#_牛客博客 (nowcoder.net)
SELECT course_id,course_name,
MAX(uv_cnt) max_num
FROM(SELECT course_id,course_name,
SUM(uv) OVER(PARTITION BY course_id ORDER BY dt,uv DESC) uv_cnt
FROM(SELECT course_id,user_id,
in_datetime dt,1 AS uv
FROM attend_tb
UNION ALL
SELECT course_id,user_id,
out_datetime dt,-1 AS uv
FROM attend_tb
) uv_tb
JOIN course_tb USING (course_id)
) t1
GROUP BY course_id,course_name
ORDER BY course_id
淘宝
店铺的SPU数量
某宝店铺的SPU数量牛客题霸牛客网 (nowcoder.com)
SELECT style_id,count(1) SPU_num
FROM product_tb
GROUP BY style_id
ORDER BY SPU_num DESC
店铺的实际销售额与客单价
某宝店铺的实际销售额与客单价牛客题霸牛客网 (nowcoder.com)
SELECT SUM(sales_price) sales_total,
ROUND(
SUM(sales_price) / count(distinct user_id)
,2) per_trans
FROM sales_tb
店铺折扣率
SELECT
round(
(SUM(sales_price)/sum(sales_num*tag_price)) * 100
,2)
as discount_rate
FROM sales_tb s
LEFT JOIN product_tb p USING(item_id)
店铺动销率与售罄率
题目分析:题解 | #某宝店铺动销率与售罄率#_牛客博客 (nowcoder.net)
SELECT t1.style_id,
ROUND(sales_num_cnt * 100 / (inventory_cnt - sales_num_cnt),2) 'pin_rate(%)',
ROUND(gmv * 100 / total_gmv, 2) ' sell-through_rate(%)'
FROM
(SELECT style_id,
SUM(inventory) inventory_cnt,
SUM(tag_price * inventory) total_gmv
FROM product_tb
GROUP BY style_id
) t1
LEFT JOIN (SELECT style_id,
SUM(sales_num) sales_num_cnt,
SUM(sales_price) gmv
FROM sales_tb
JOIN product_tb USING (item_id)
GROUP BY style_id
) t2 USING (style_id)
ORDER BY style_id;
店铺连续2天及以上购物的用户及其对应的天数(重要)
某宝店铺连续2天及以上购物的用户及其对应的天数牛客题霸牛客网 (nowcoder.com)
题目分析:题解 | #某宝店铺连续2天及以上购物的用户及其对应的天数#_牛客博客 (nowcoder.net)
SELECT user_id,
COUNT(1) days_count
FROM (SELECT DISTINCT sales_date,user_id,
DENSE_RANK() OVER(PARTITION BY user_id ORDER BY sales_date)rk FROM sales_tb) t1
GROUP BY user_id,
DATE_SUB(sales_date,INTERVAL rk DAY)
HAVING COUNT(1)>=2;
知乎
问答11月份日人均回答量
SELECT answer_date,
ROUND(
count(issue_id) / count(distinct author_id)
,2) per_num
FROM answer_tb
GROUP BY answer_date
问答质量的回答总用户属于各级别的数量
SELECT
case
when b.author_level in (1,2) then '1-2级'
when b.author_level in (3,4) then '3-4级'
when b.author_level in (5,6) then '5-6级'
else '' end as level_cut,
count(issue_id) num
from answer_tb a
left join author_tb b USING(author_id)
where char_len >= 100
group by level_cut
order by num desc
问答日回答问题数大于等于3个的所有用户
SELECT answer_date,author_id,
count(1) as answer_cnt
FROM answer_tb
GROUP BY answer_date,author_id
HAVING answer_cnt >= 3
ORDER BY answer_date,author_id
回答过教育类问题的用户同时回答过职场类的用户
SELECT count(distinct author_id) num
FROM issue_tb
JOIN answer_tb USING(issue_id)
WHERE issue_type = 'Education' and author_id in (
SELECT author_id
FROM issue_tb
JOIN answer_tb USING(issue_id)
WHERE issue_type = 'Career'
)
最大连续回答问题天数大于3天
题目分析:题解 | #某乎问答最大连续回答问题天数大于等于3天的用户及其对应等级#_牛客博客 (nowcoder.net)
SELECT author_id,author_level,
COUNT(1) days_cnt
FROM
(SELECT DISTINCT author_id,
answer_date,author_level,
DENSE_RANK() OVER (PARTITION BY author_id ORDER BY answer_date) rk
FROM answer_tb
JOIN author_tb USING (author_id)
) t1
GROUP BY author_id,author_level,
DATE_SUB(answer_date, INTERVAL rk DAY)
HAVING COUNT(1) >= 3
ORDER BY author_id;