HiveSql 面试题 - 统计用户注册日期,总登录次数、订单数等指标

1 需求

从用户登录明细表(user_login_detail)和订单信息表(order_info)中查询每个用户的注册日期(首次登录日期)、总登录次数以及其在2021年的登录次数、订单数和订单总额。

  • 需要用到的表

用户登录明细表:user_login_detail

user_id(用户id)ip_address(ip地址)login_ts(登录时间)logout_ts(登出时间)
101180.149.130.1612021-09-21 08:00:002021-09-27 08:30:00
102120.245.11.22021-09-22 09:00:002021-09-27 09:30:00
10327.184.97.32021-09-23 10:00:002021-09-27 10:30:00

订单信息表:order_info

order_id (订单id)user_id (用户id)create_date (下单日期)total_amount (订单金额)
11012021-09-3029000.00
101032020-10-0228000.00
  • 期望结果
user_id (用户id) register_date (注册日期) total_login_count (累积登录次数) login_count_2021 (2021年登录次数) order_count_2021 (2021年下单次数) order_amount_2021 (2021年订单金额) <decimal(16,2)>
1012021-09-21554143660.00
1022021-09-22444177850.00
1032021-09-2322475890.00
1042021-09-2444489880.00
1052021-10-04114120100.00
1062021-10-04224119150.00
1072021-09-25444124150.00
1082021-10-06224155770.00
1092021-09-26332129480.00

2 解答

  • 思路

题目需求比较复杂,由多个小需求合并才可以得到结果数据,并且统计的维度也不太相同,这里分别对每个子需求进行计算,最后再合并即可。

  • 实现

1 统计用户的注册日期:使用开窗函数取得第一次登录日期即可

select user_id, date_format(login_ts, 'yyyy-MM-dd') register_date
from (
         SELECT user_id,
                login_ts,
                row_number() over (partition by user_id order by login_ts asc) rn
         from user_login_detail
         group by user_id, login_ts
         ) tmp
where rn = 1
user_idregister_date
1012021-09-21
10102021-09-27
1022021-09-22
1032021-09-23
1042021-09-24
1052021-10-04
1062021-10-04
1072021-09-25
1082021-10-06
1092021-09-26

2 统计每个用户的总登录次数

select user_id,count(login_ts) total_login_count from user_login_detail group by user_id
user_idtotal_login_count
1015
10102
1024
1032
1044
1051
1062
1074
1082
1093

3 统计每个用户在 21 年的登录次数

select user_id,count(login_ts) login_count_2021 from user_login_detail 
where login_ts like '2021%' group by user_id
user_idlogin_count_2021
1015
10102
1024
1032
1044
1051
1062
1074
1082
1093

4 统计每个用户在 21 年的订单信息

SELECT user_id,count(order_id) order_count_2021,sum(total_amount) order_amount_2021
from order_info where create_date like '2021%' group by user_id
user_idorder_amount_2021order_count_2021
101143660.004
102177850.004
10375890.004
10489880.004
105120100.004
106119150.004
107124150.004
108155770.004
109129480.002

5 数据合并

select t1.user_id, register_date, total_login_count, login_count_2021, order_count_2021, order_amount_2021
from (select user_id, date_format(login_ts, 'yyyy-MM-dd') register_date
      from (
               SELECT user_id,
                      login_ts,
                      row_number() over (partition by user_id order by login_ts asc) rn
               from user_login_detail
               group by user_id, login_ts
               ) tmp
      where rn = 1) t1
     inner join (select user_id, count(login_ts) total_login_count from user_login_detail group by user_id) t2
                on t1.user_id = t2.user_id
     inner join (select user_id, count(login_ts) login_count_2021
                 from user_login_detail
                 where login_ts like '2021%'
                 group by user_id) t3 on t1.user_id = t3.user_id
     inner join (SELECT user_id, count(order_id) order_count_2021, sum(total_amount) order_amount_2021
                 from order_info
                 where create_date like '2021%'
                 group by user_id) t4 on t1.user_id = t4.user_id
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值