中级练习[14]:Hive SQL

目录

1. 统计活跃间隔对用户分级结果

1.1 题目需求

1.2 代码实现

2. 连续签到领金币数

2.1 题目需求

2.2 代码实现

3. 国庆期间的7日动销率和滞销率

3.1 题目需求

3.2 代码实现

4. 同时在线最多的人数

4.1 题目需求

4.2 代码实现


1. 统计活跃间隔对用户分级结果

1.1 题目需求

用户等级定义:

  • 忠实用户:近7天活跃且非新用户
  • 新晋用户:近7天新增
  • 沉睡用户:近7天未活跃但是在7天前活跃
  • 流失用户:近30天未活跃但是在30天前活跃

假设今天是数据中所有日期的最大值,从用户登录明细表中的用户登录时间给各用户分级,求出各等级用户的人数。

Level(用户等级) Cn(用户数量)
忠实用户 6
新增用户 3
沉睡用户 1

1.2 代码实现

SELECT
  t2.level,
  COUNT(*)
FROM
  (
    SELECT
      uld.user_id,
      CASE
        WHEN (DATE_FORMAT(MAX(uld.login_ts), 'yyyy-MM-dd') <= DATE_SUB(TODAY(), 30)) THEN '流失用户'
        WHEN (DATE_FORMAT(MIN(uld.login_ts), 'yyyy-MM-dd') <= DATE_SUB(TODAY(), 7) AND DATE_FORMAT(MAX(uld.login_ts), 'yyyy-MM-dd') >= DATE_SUB(TODAY(), 7)) THEN '忠实用户'
        WHEN (DATE_FORMAT(MIN(uld.login_ts), 'yyyy-MM-dd') >= DATE_SUB(TODAY(), 7)) THEN '新增用户'
        WHEN (DATE_FORMAT(MIN(uld.login_ts), 'yyyy-MM-dd') <= DATE_SUB(TODAY(), 7) AND DATE_FORMAT(MAX(uld.login_ts), 'yyyy-MM-dd') <= DATE_SUB(TODAY(), 7)) THEN '沉睡用户'
      END AS level
    FROM
      user_login_detail uld
    JOIN
      (
        SELECT 
          DATE_FORMAT(MAX(login_ts), 'yyyy-MM-dd') AS today 
        FROM
          user_login_detail
      ) t1
    ON
      1 = 1
    GROUP BY 
      uld.user_id, t1.today
  ) t2
GROUP BY
  t2.level;

2. 连续签到领金币数

2.1 题目需求

用户每天签到可以领1金币,并可以累计签到天数,连续签到的第3、7天分别可以额外领2和6金币。每连续签到7天重新累积签到天数。从用户登录明细表中求出每个用户金币总数,并按照金币总数倒序排序。

User_id(用户id) Sum_coin_cn(金币总数)
101 7
109 3
107 3
102 3
106 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据深度洞察

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值