经典sql

一、连续登录问题

问题:1)、每个用户连续登录最大天数

            2)、连续登录大于三天的用户数

分析:本质都是计算用户连续登录天数

方案一:利用排序窗口

select a.user_id
      ,a.date_rslt
      ,count(1) as cnt
from (
        select    
            t.user_id
            ,t.login_time
            ,date_sub(login_time, num) as date_rslt
         from (
                select 
                    user_id
                    ,login_time
                    ,row_number() over(partition by user_id order by login_time) as num
                from login_log
         ) t
      ) a
group by a.user_id,a.date_rslt

方案二、增量加全量

连续访问天数v_days(最新flag值为1,则v_days累加,否则为0)

历史最大访问天数max_days (从max_days、v_days中取最大值)

select 
    coaleasce(h.user_id,i.user_id) as user_id,
    if(i.user_id is not null,v_days+1,0) as v_days,
    greatest(max_days,if(i.user_id is not null,v_days+1,0)) as max_days
from
history_ds h
full join 
log_time i

扩展1:连续登录,中间间隔1天也算

select user_id
       ,group_id
       ,(datediff(max(login_date),min(login_date))+1) as continuous_login_days
  from (
      select 
            user_id
            ,login_date
            ,sum(if(date_diff>1,1,0)) over(partition by user_id order by login_date rows between unboundedpreceding and current row) as group_id
      from (
        select 
            user_id
            ,login_date
            ,datediff(login_date,last_login_date) as date_diff
        from (
            select 
                user_id
                ,login_date
                ,lag(login_date,1,'1970-01-01') over(partition by user_id order by login_date) as last_login_date
            from test_login
        )t1
    )t2
)t3
group by user_id
       ,group_id;

扩展2:断点排序

连续日期的数据对应的值发生变化,重新排序

select  
  a,
  b,
  row_number() over( partition by b,a_diff order by a) as c
from 
(
  select  
    a,
    b,
    a-num as a_diff
  from 
  (
   select 
     a,
     b,
     row_number() over( partition by b order by  a ) as num
   from t1 
  )tmp1
)tmp2
order by a; 

相关推荐

  1. <span style='color:red;'>经典</span><span style='color:red;'>sql</span>

    经典sql

    2024-06-19 08:26:01      8 阅读
  2. SQL经典面试题

    2024-06-19 08:26:01       24 阅读
  3. oracle常用经典SQL查询

    2024-06-19 08:26:01       9 阅读
  4. SQL】力扣1571. 仓库经理

    2024-06-19 08:26:01       34 阅读
  5. 天池SQL训练营(六)-综合练习题-10道经典题目

    2024-06-19 08:26:01       27 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-19 08:26:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-19 08:26:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-19 08:26:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-19 08:26:01       18 阅读

热门阅读

  1. 硬盘的缓存有什么作用

    2024-06-19 08:26:01       7 阅读
  2. PHP框架详解-symfony框架

    2024-06-19 08:26:01       9 阅读
  3. vue实现点击元素跳转至另一个网站

    2024-06-19 08:26:01       6 阅读
  4. R语言数据分析案例:探索在线零售数据集

    2024-06-19 08:26:01       6 阅读
  5. state和store的使用场景

    2024-06-19 08:26:01       10 阅读
  6. 判断素数的方法

    2024-06-19 08:26:01       4 阅读
  7. 负载均衡(DR)

    2024-06-19 08:26:01       7 阅读
  8. HTML的超链接和图音频

    2024-06-19 08:26:01       6 阅读
  9. 负载均衡集群(NAT)

    2024-06-19 08:26:01       6 阅读
  10. 第4天:用户认证系统实现

    2024-06-19 08:26:01       9 阅读
  11. Yolo介绍要点和难点具体应用场景案例

    2024-06-19 08:26:01       9 阅读