暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL脚本案例【10】查询首次下单后第二天连续下单的用户比率

皮皮克克 2024-04-20
197

点击关注公众号,干货第一时间送达


"比率"的问题,不知道诸位遇到过没有,

今天来看看,

补上这个知识点。

【温馨提示:建表语句及数据导入脚本,可以翻看前面的文章:

SQL脚本案例【8】查询累积销量排名第二的商品


一、需求场景

题目: 

从订单信息表中,查询首次下单后第二天连续下单的用户比率。

订单信息表(order_info)如下:

正确结果:


二、解决方案

演示工具:Hive-3.1.3 + DataGrip2022


要求的是用户比率,但首先需要分析的是用户下单情况。

大致的思路就是:

查询出每个用户第一次下单日期,和第二次下单日期,

计算这两个日期的差值,从而获得连续下单的用户数量,

最后算个比值即可。


(1)分组计算每个用户的下单日期

 select user_id,create_date
 from order_info
 group by user_id,create_date

结果集:

(2)为每个用户的下单日期排序

因为第(1)步骤里面已经进行分组,这步骤的排序可以任意使用排序函数,rank()、dense_rank()、row_number(),

有关这三个开窗排序函数的使用,可以翻看前面的文章:

SQL脚本案例【7】每个学生,按各科成绩排序,并显示排名


select
    user_id,
    create_date,
    rank() over (partition by user_id order by create_date) as rk
from (
         select user_id,create_date
         from order_info
         group by user_id,create_date
     )t1


结果集:

(3)筛选每个用户的前2个下单日期

因为要计算首日下单和第二次连续下单的用户比率,

所以此处需要先筛选首日下单日期和第二次下单日期,

这筛选出的两个日期,可以通过max() 和 min() 函数排序。

 select user_id,
        min(create_date) as firstDt,
        max(create_date) as secondDt
 from (
          select
              user_id,
              create_date,
              rank() over (partition by user_id order by create_date) as rk
          from (
                   select user_id,create_date
                   from order_info
                   group by user_id,create_date
               )t1
      )t2
 where rk<=2
 group by user_id


结果集:

(4)计算每个用户前两次下单日期的差值

日期差值的计算可以使用 datediff() 函数,

再搭配sum() 函数进行数量的累加,

总数就是 count(*) 

比值就好求了。

select sum(`if`(datediff(secondDt,firstDt)=1,1,0)) / count(*) *100
from (
   select user_id,
          min(create_date) as firstDt,
          max(create_date) as secondDt
   from (
            select
                user_id,
                create_date,
                rank() over (partition by user_id order by create_date) as rk
            from (
                     select user_id,create_date
                     from order_info
                     group by user_id,create_date
                 )t1
        )t2
   where rk<=2
   group by user_id
)t3


结果集:

(5)对结果值可以保留两位小数

使用 round() 函数

select round(sum(`if`(datediff(secondDt,firstDt)=1,1,0)) / count(*) *100,2)
from (
   select user_id,
          min(create_date) as firstDt,
          max(create_date) as secondDt
   from (
            select
                user_id,
                create_date,
                rank() over (partition by user_id order by create_date) as rk
            from (
                     select user_id,create_date
                     from order_info
                     group by user_id,create_date
                 )t1
        )t2
   where rk<=2
   group by user_id
)t3


结果:

(6)将结果值拼接上百分号%

select concat(round(sum(`if`(datediff(secondDt,firstDt)=1,1,0)) / count(*) *100,2),'%')
from (
         select user_id,
                min(create_date) as firstDt,
                max(create_date) as secondDt
         from (
                  select
                      user_id,
                      create_date,
                      rank() over (partition by user_id order by create_date) as rk
                  from (
                           select user_id,create_date
                           from order_info
                           group by user_id,create_date
                       )t1
              )t2
         where rk<=2
         group by user_id
     )t3


结果:



结束语:
Ok,就是本篇文章的全部内容了。
如果各位有不懂的地方,欢迎发消息给小编,小编会进行详细地解答。
最后,请屏幕前的各位吴彦祖和刘亦菲们,动动你们的小手,给小编一个

文章转载自皮皮克克,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论