【场景】:连续记录
【分类】:分组条件查询、窗口函数
分析思路
难点:
1.如何表示连接?连续的表示: 日期减去排序的值相等
2.记得先对日期、用户去重
(1)对日期、创作者进行去重
- [使用]:distinct
(2)统计日期、创作者、日期减去排序的值(连续签到)
连续的表示: 日期减去排序的值相等;
- [使用]:date(in_time) - row_number()
(3)统计最大连续回答问题的天数大于等于3天的用户及其等级(若有多条符合条件的数据,按author_id升序排序)
-
[条件]:最大连续回答问题的天数大于等于3天
-
[使用]:group by 分组条件 [创作者;等级] having count(连续天数) >= 3 order by [创作者]
最终结果
select 查询结果 [创作者;等级;连续回答天数]
from 从哪张表中查询数据[多表]
group by 分组条件 [创作者;等级]
having 判断条件 [连续回答问题的天数大于等于3]
order by 对查询结果排序 [创作者升序];
扩展
前往查看: MySQL 连续记录 场景分析
求解代码
方法一:
with
main as(
#对日期、创作者进行去重
select distinct
answer_date,
author_id
from answer_tb
)
,main1 as(
#统计日期、创作者、日期减去排序的值(连续签到)
select
answer_date,
author_id,
answer_date - row_number() over(partition by author_id order by answer_date) as data
from main
)
#统计最大连续回答问题的天数大于等于3天的用户及其等级(若有多条符合条件的数据,按author_id升序排序)
select
author_id,
author_level,
count(data) as days_cnt
from author_tb
join main1 using(author_id)
group by author_id,author_level having count(data) >= 3
order by author_id
方法二:
多表连接
#统计最大连续回答问题的天数大于等于3天的用户及其等级(若有多条符合条件的数据,按author_id升序排序)
select
author_id,
author_level,
count(data) as days_cnt
from author_tb
join(
#统计日期、创作者、日期减去排序的值(连续签到)
select
answer_date,
author_id,
answer_date - dense_rank() over(partition by author_id order by answer_date) as data
from(
#对日期、创作者进行去重
select distinct
answer_date,
author_id
from answer_tb
) main
) main1 using(author_id)
group by author_id,author_level having count(data) >= 3
order by author_id