目录
[1. 即时订单比例](#1. 即时订单比例)
[1.1 题目需求](#1.1 题目需求)
[1.2 代码实现](#1.2 代码实现)
[2. 向用户推荐朋友收藏的商品](#2. 向用户推荐朋友收藏的商品)
[2.1 题目需求](#2.1 题目需求)
[2.2 代码实现](#2.2 代码实现)
[3. 查询所有用户的连续登录两天及以上的日期区间](#3. 查询所有用户的连续登录两天及以上的日期区间)
[3.1 题目需求](#3.1 题目需求)
[3.2 代码实现](#3.2 代码实现)
1. 即时订单比例
1.1 题目需求
从配送信息表(delivery_info)中求出每个用户的首单(用户的第一个订单)中即时订单的比例,并保留两位小数,以小数形式显示。即时订单是指期望配送日期和下单日期相同的订单,而计划订单是指期望配送日期和下单日期不同的订单。
期望结果如下:
percentage |
---|
0.5 |
1.2 代码实现
sql
hive>
select
round(sum(if(order_date=custom_date,1,0))/count(*),2) percentage
from
(
select
delivery_id,
user_id,
order_date,
custom_date,
row_number() over (partition by user_id order by order_date) rn
from delivery_info
)t1
where rn=1;
2. 向用户推荐朋友收藏的商品
2.1 题目需求
从好友关系表(friendship_info)和收藏表(favor_info)中查询出应向哪位用户推荐哪些商品。推荐的商品应该是用户的朋友已收藏但用户自己尚未收藏的商品。
1)部分结果展示
user_id | sku_id |
---|---|
101 | 2 |
101 | 4 |
101 | 7 |
101 | 9 |
101 | 8 |
101 | 11 |
101 | 1 |
2)完整结果
user_id | sku_id |
---|---|
101 | 2 |
101 | 4 |
101 | 7 |
... | ... |
2.2 代码实现
sql
hive>
select
distinct t1.user_id,
friend_favor.sku_id
from
(
select
user1_id user_id,
user2_id friend_id
from friendship_info
union
select
user2_id,
user1_id
from friendship_info
)t1
left join favor_info friend_favor
on t1.friend_id=friend_favor.user_id
left join favor_info user_favor
on t1.user_id=user_favor.user_id
and friend_favor.sku_id=user_favor.sku_id
where user_favor.sku_id is null;
3. 查询所有用户的连续登录两天及以上的日期区间
3.1 题目需求
从登录明细表(user_login_detail)中查询出所有用户的连续登录两天及以上的日期区间,以登录时间(login_ts)为准。
期望结果如下:
user_id | start_date | end_date |
---|---|---|
101 | 2021-09-27 | 2021-09-30 |
102 | 2021-10-01 | 2021-10-02 |
106 | 2021-10-04 | 2021-10-05 |
107 | 2021-10-05 | 2021-10-06 |
3.2 代码实现
sql
hive>
select user_id,
min(login_date) start_date,
max(login_date) end_date
from (
select user_id,
login_date,
date_sub(login_date, rn) flag
from (
select user_id,
login_date,
row_number() over (partition by user_id order by login_date) rn
from (
select user_id,
date_format(login_ts, 'yyyy-MM-dd') login_date
from user_login_detail
group by user_id, date_format(login_ts, 'yyyy-MM-dd')
) t1
) t2
) t3
group by user_id, flag
having count(*) >= 2