前言:
前一段时间遇到了一个需求,有一个运营活动要求在站内连续发布部分问题回答的学员,每日发布多次也算一次。当时绞尽脑汁最后求了 用户和有发布回答的天数排序的数据,但是连续问题想了一两个小时没得题解。幸亏那次数据量不大,后来直接用excel手动筛选解决了问题。
后来一个朋友又遇到了这个问题询问我有没有解决办法,我当时对他说没有,他当时狠狠鄙视了我一下,说 ‘你不是sql精通吗?就这就这?’。后来这个题解还是在我朋友那得到的,他们公司的一个sql大佬写的一个思路,思路大概如下图
这个时候可能有的同学有点懵,‘这啥玩意啊,就这都解了?’。当然解题不会那么简单,这只是一个思路,不过遇到这个问题的同学看到这张图片我觉着应该也有解题办法了。
正文题解
member_id | publish_date | answer_id |
---|---|---|
123 | 2022-12-26 | 12344 |
假设有表 answer ,其中有字段member_id、publish_date、answer_id,要求在2022-12-01到2022-12-31作者最大连续发布回答的最大天数。
select
--求出作者id,最大打卡次数
member_id,
max(num) as continue_day
from
(
-- 求出作者id,总日期和打卡日期排序后相差的天数,相差天数的打卡数
select
t2.member_id,
t1.order_num1 - t2.order_num2 as gap_date,
count(1) as num
from
(
--取出全部时间,并按照时间去重排序
select
distinct publish_date,
dense_rank() over(
order by
publish_date
) as order_num1
from
answer
where
publish_date between '2022-12-01' and '2022-12-31'
) t1
left join (
--取出全部打卡的数据,按照作者和天进行去重排序
select
distinct member_id,
publish_date,
dense_rank() over(
partition by member_id
order by
publish_date
) as order_num2
from
answer
where
publish_date between '2022-12-01' and '2022-12-31'
) t2 on t1.publish_date = t2.publish_date
group by
t2.member_id,
t1.order_num1 - t2.order_num2
) as a
group by
member_id