首页 > 其他分享 >Hive 面试题——设计一个1~60天的注册、活跃留存表

Hive 面试题——设计一个1~60天的注册、活跃留存表

时间:2023-02-12 07:22:04浏览次数:47  
标签:面试题 regist Hive t1 60 active user date id

需求描述

现有一个用户活跃表 user_active (user_id,active_date)、用户注册表 user_regist(user_id,regist_date),表中分区字段都为dt(yyyy-MM-dd),用户字段均为user_id;设计一张1-60天注册活跃留存表;

需求分析

需求中要求设计留存周期为1-60天的注册、活跃留存输出效果如下:

主要考察点: 一对多关联 

观察表结构:我们可以看出,针对每一天来讲分母固定,分子随留存周期变动,

第一步:求出注册表中,每日注册数,注册数作为分母,针对每一天的留存数据来讲是个固定值,这里用开窗求解该指标。

select user_id, regist_date, count(user_id) over (partition by regist_date) regist_cnt
from user_regist
where dt >= date_sub(current_date(), 60)
第二步:用户注册表作为主表,关联活跃表,关联健为user_id,由于一对多的关系,产生笛卡尔集;注意:活跃用户表,每天用户会有多次活跃注意去重
select t.regist_date,
       t.user_id,
       t.regist_cnt,
       t1.user_id,
       t1.active_date,
       datediff(t1.active_date, t.regist_date) adte_diff
from (select user_id, regist_date, count(user_id) over (partition by regist_date) regist_cnt
      from user_regist
      where dt >= date_sub(current_date(), 60)) t
         left join
     (select user_id, active_date
      from user_active
      where dt >= date_sub(current_date(), 60)
      group by user_id, active_date) t1
     on t.user_id = t1.user_id;

第三步:按照注册日期和留存周期分组,计算该留存周期下、该时间点下的活跃用户数

select t.regist_date,
       max(t.regist_cnt)                       regist_cnt,--注册用户数为固定值,使用 max 取就行
       datediff(t1.active_date, t.regist_date) adte_diff,
       count(t1.user_id)                       active_cnt
from (select user_id, regist_date, count(user_id) over (partition by regist_date) regist_cnt
      from user_regist
      where dt >= date_sub(current_date(), 60)) t
         left join
     (select user_id, active_date
      from user_active
      where dt >= date_sub(current_date(), 60)
      group by user_id, active_date) t1
     on t.user_id = t1.user_id
where datediff(t1.active_date, t.regist_date) >= 1
  and datediff(t1.active_date, t.regist_date) <= 60
group by t.regist_date, datediff(t1.active_date, t.regist_date)

第四步:计算率留存

select regist_date, date_diff, active_cnt, active_cnt / regist_cnt retention_rate
from (select t.regist_date,
             max(t.regist_cnt)                       regist_cnt,--注册用户数为固定值,使用 max 取就行
             datediff(t1.active_date, t.regist_date) date_diff,
             count(t1.user_id)                       active_cnt
      from (select user_id, regist_date, count(user_id) over (partition by regist_date) regist_cnt
            from user_regist
            where dt >= date_sub(current_date(), 60)) t
               left join
           (select user_id, active_date
            from user_active
            where dt >= date_sub(current_date(), 60)
            group by user_id, active_date) t1
           on t.user_id = t1.user_id
      where datediff(t1.active_date, t.regist_date) >= 1
        and datediff(t1.active_date, t.regist_date) <= 60
      group by t.regist_date, datediff(t1.active_date, t.regist_date)) t
where regist_cnt > 0;

标签:面试题,regist,Hive,t1,60,active,user,date,id
From: https://www.cnblogs.com/wdh01/p/17110884.html

相关文章

  • 多线程面试题
    实现线程有哪几种方式?4种https://blog.csdn.net/weixin_46217160/article/details/108721306A继承类Thread,重写run()方法,调用Thread类中的start()方法启动线程;MyThrea......
  • 集合面试题
    Java集合集合就是一个可变长度的用来存放数据的容器,准确的说是存放数据对象引用的容器,集合类存放的都是对象的引用,而不是对象的本身(不能存储基本数据类型)。集合类存放于J......
  • #yyds干货盘点# LeetCode面试题:盛最多水的容器
    1.简述:给定一个长度为n的整数数组 height 。有 n 条垂线,第i条线的两个端点是 (i,0) 和 (i,height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可......
  • 关于全景(360)图片拼接的方法(Opencv3.0 Stitcher)
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。前置说明  本文作为本人csdnblog的主站的备份。(BlogID......
  • 关于全景(360)图片拼接的方法(Opencv3.0 Stitcher)----续(一)
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。前置说明  本文作为本人csdnblog的主站的备份。(BlogID......
  • 面试题--mysql的数据库优化
    mysql的数据库优化 当有人问你如何对数据库进行优化时,很多人第一反应想到的就是SQL优化,如何创建索引,如何改写SQL,他们把数据库优化与SQL优化划上了等号。当然这不......
  • java面试题(一)
    1、面向对象的特征有哪些方面?1.抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的......
  • java面试题(二)
    1、用最有效率的方法计算2乘以8?答:2<<3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方)。补充:我们为编写的类重写hashCode方法时,可能会看到如下所......
  • 前端学习案例11-原型面试题2
    ......
  • 前端学习案例10-原型面试题
     ......