【场景】:连续记录

【分类】:分组条件查询、窗口函数

分析思路

难点:

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