Hive sql 每天场景题12-15

时间:2023-01-07 13:53:09

12、查询所有商品(sku_info表)截至到2021年10月01号的最新商品价格(需要结合价格修改表进行分析)

期望结果如下:

sku_id
<string>
(商品id)

price
<decimal(16,2)>
(商品价格)

1

2000.00

2

10.00

3

5000.00

4

6000.00

5

500.00

6

2000.00

7

100.00

8

600.00

9

1000.00

10

90.00

11

66.00

12

20.00

需要用到的表:

商品信息表:sku_info

sku_id(商品id)

name(商品名称)

category_id(分类id)

from_date(上架日期)

price(商品价格)

1

xiaomi 10

1

2020-01-01

2000

6

洗碗机

2

2020-02-01

2000

9

自行车

3

2020-01-01

1000

商品价格变更明细表:sku_price_modify_detail

sku_id(商品id)

new_price(本次变更之后的价格)

change_date(变更日期)

1

1900.00

2021-09-25

1

2000.00

2021-09-26

2

80.00

2021-09-29

2

10.00

2021-09-30

代码

select a.sku_id,b.new_price  as price
from (select * from sku_info where from_date <='2021-10-01') a 
left join (select * from (select sku_id,new_price,change_date,rank() over(partition by sku_id order by change_date desc) as rk from sku_price_modify_detail where change_date <= '2021-10-01')c where rk=1 )b on a.sku_id=b.sku_id

13、订单配送中,如果期望配送日期和下单日期相同,称为即时订单,如果期望配送日期和下单日期不同,称为计划订单。
请从配送信息表(delivery_info)中求出每个用户的首单(用户的第一个订单)中即时订单的比例,保留两位小数,以小数形式显示。

期望结果如下:

percentage
<decimal(16,2)>

0.50

需要用到的表:

配送信息表:delivery_info

delivery_id (运单 id

order_id (订单id)

user_id (用户 id )

order_date (下单日期)

custom_date (期望配送日期)

1

1

101

2021-09-27

2021-09-29

2

2

101

2021-09-28

2021-09-28

3

3

101

2021-09-29

2021-09-30

代码

select  cast (avg(if(delivery_cat='即时订单',1,0)) as decimal(10,2))  as percentage
from (select 
 user_id 
,order_date 
,custom_date 
,if(order_date=custom_date ,'即时订单','计划订单') as delivery_cat
,delivery_id 
,rank() over(partition by user_id order by order_date,delivery_id  ) as rk from delivery_info
)a
where rk=1

14、 现需要请向所有用户推荐其朋友收藏但是用户自己未收藏的商品,请从好友关系表(friendship_info)和收藏表(favor_info)中查询出应向哪位用户推荐哪些商品。

期望结果如下:

user_id
<string>
(用户id)

sku_id
<string>
(应向该用户推荐的商品id)

101

2

101

4

101

7

101

9

101

8

101

11

101

1

需要用到的表:

好友关系表:friendship_info

user1_id(用户1 id)

user2_id(用户2 id)

101

1010

101

108

101

106

收藏表:favor_info

user_id(用户id)

sku_id(商品id)

create_date(收藏日期)

101

3

2021-09-23

101

12

2021-09-23

101

6

2021-09-25

代码

--列出用户,所以是user1_id
select distinct A.user1_id as user_id ,A.sku_id 
from 
(
    --用户->朋友->收藏 , 列出所有有收藏的朋友,因为有些朋友没有收藏,所以用inner
    select A.user1_id,A.user2_id,B.sku_id 
    from 
    friendship_info A 
    inner join 
    favor_info B 
    on A.user2_id=B.user_id
)A 
-- 用户->收藏  ,用left join 以及 null 筛选 这些朋友有收藏但是用户本身没有收藏的用户
left join 
favor_info B  on A.user1_id=B.user_id and A.sku_id=B.sku_id
where B.sku_id is null
order by A.user1_id,A.sku_id 

15、从登录明细表(user_login_detail)中查询出,所有用户的连续登录两天及以上的日期区间,以登录时间(login_ts)为准。

期望结果如下:

user_id
<string>
(用户id)

start_date
<string>
(开始日期)

end_date
<string>
(结束日期)

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

需要用到的表:

登录明细表:user_login_detail

user_id(用户id)

ip_address(ip地址)

login_ts(登录时间)

logout_ts(登出时间)

101

180.149.130.161

2021-09-21 08:00:00

2021-09-27 08:30:00

102

120.245.11.2

2021-09-22 09:00:00

2021-09-27 09:30:00

103

27.184.97.3

2021-09-23 10:00:00

2021-09-27 10:30:00

代码

select * from (
select
user_id,min(login_ts) as start_date,max(login_ts) as end_date
from
(
    select
      -- 用户 开始日期 结束日期  下一个登录日期
      user_id,
      substr(login_ts, 1, 10) as login_ts,
      substr(logout_ts, 1, 10) as logout_ts,
      lead(substr(login_ts, 1, 10)) over(partition by user_id order by login_ts )  next_login_ts
    from
      user_login_detail
  ) a
where datediff(next_login_ts,login_ts)=1 or next_login_ts is null
group by user_id
order by user_id
)b where  datediff(end_date,start_date)>=1