sql如何求连续打卡

前言:

  前一段时间遇到了一个需求,有一个运营活动要求在站内连续发布部分问题回答的学员,每日发布多次也算一次。当时绞尽脑汁最后求了 用户和有发布回答的天数排序的数据,但是连续问题想了一两个小时没得题解。幸亏那次数据量不大,后来直接用excel手动筛选解决了问题。
  后来一个朋友又遇到了这个问题询问我有没有解决办法,我当时对他说没有,他当时狠狠鄙视了我一下,说 ‘你不是sql精通吗?就这就这?’。后来这个题解还是在我朋友那得到的,他们公司的一个sql大佬写的一个思路,思路大概如下图
在这里插入图片描述

这个时候可能有的同学有点懵,‘这啥玩意啊,就这都解了?’。当然解题不会那么简单,这只是一个思路,不过遇到这个问题的同学看到这张图片我觉着应该也有解题办法了。

正文题解

member_idpublish_dateanswer_id
1232022-12-2612344

假设有表 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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值