美文网首页
牛 SQL 12 连续领金币

牛 SQL 12 连续领金币

作者: 七齐起器 | 来源:发表于2021-12-20 19:25 被阅读0次

    题解:
    1)首先给tb_user_log 表做初步的筛选和编号,方便后续做标记;
    2)首先登录几天就有几个金币,第3、7天有额外金币;
    3)利用中间表做编号,由于每隔7天就清零,还有换了账号就清零,所以必须case when来判断逻辑算金币;
    需要达到的效果如下;

    101|202107|2021-07-07|None|101|0.000
    101|202107|2021-07-08|2021-07-07|101|1.000
    101|202107|2021-07-09|2021-07-08|101|2.000
    101|202107|2021-07-10|2021-07-09|101|3.000
    101|202107|2021-07-11|2021-07-10|101|4.000
    101|202107|2021-07-12|2021-07-11|101|5.000
    101|202107|2021-07-13|2021-07-12|101|6.000
    101|202107|2021-07-14|2021-07-13|101|0.000
    101|202107|2021-07-15|2021-07-14|101|1.000
    101|202107|2021-07-16|2021-07-15|101|2.000
    102|202110|2021-10-01|None|101|3.000
    102|202110|2021-10-02|2021-10-01|101|4.000
    102|202110|2021-10-03|2021-10-02|101|5.000
    102|202110|2021-10-05|2021-10-03|101|0.000
    102|202110|2021-10-06|2021-10-05|101|1.000
    

    最后贴上SQL代码,做了一天总算有所收获。

    with tmp as(
    select uid
        ,date(in_time)in_time
        ,row_number() over(partition by uid order by date(in_time))id
    from tb_user_log where artical_id=0 and sign_in=1 and date(in_time)>='2021-07-07' and date(in_time)<'2021-11-01'
    )
    
    select
    a.uid
    ,a.i_time
    ,sum(1)
    +sum(case when a.id=2 then 2 else 0 end)
    +sum(case when a.id=6 then 6 else 0 end)
    from(
    select a.uid
    ,date_format(a.in_time,'%Y%m')i_time
    ,@uid
        ,case when @uid=a.uid then case when a.in_time!=date_add(b.in_time,interval 1 day) or b.in_time is null 
                                        then @id:=0 
                                        else 
                                          case when @id<6 
                                               then @id:=@id+1 
                                               else @id:=0 
                                           end
                                        end
               when @uid<>a.uid then case when a.in_time!=date_add(b.in_time,interval 1 day) or b.in_time is null 
                                        then @id:=0 
                                        else 
                                          case when @id<6 
                                               then @id:=@id+1 
                                               else @id:=0 
                                           end
                                        end       
          end id
    from (select @id:=-1,@uid:=uid from tmp where id=1 limit 1) as init2,tmp a left join tmp b
    on a.id=b.id+1 and a.uid=b.uid
    )a group by a.uid,a.i_time
    

    相关文章

      网友评论

          本文标题:牛 SQL 12 连续领金币

          本文链接:https://www.haomeiwen.com/subject/otizfrtx.html