中级练习[6]:Hive SQL订单配送与用户社交行为分析

目录

[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
相关推荐
2501_933670793 小时前
2026秋招量化分析岗技能栈:Python、SQL、统计建模、回测项目怎么准备
开发语言·python·sql
tedcloud1233 小时前
Wand-Enhancer 怎么搭建?开源 Wand 客户端增强与远程控制工具介绍
大数据·服务器·人工智能·开源·音视频
天衍四九-4 小时前
MySQL中如何定位慢查询?如果SQL语句执行很慢,如何分析和优化?
数据库·sql·mysql
大大大大晴天5 小时前
每天认识一个组件:分布式缓存Alluxio
大数据
程序员阿鹏6 小时前
为什么MySQL InnoDB选择B+树?
数据结构·数据库·b树·sql·mysql·算法·缓存
AI_Auto6 小时前
架构视角看数字化转型|核心架构:大共享平台+小应用,从按需走向适变
大数据·人工智能·架构·制造
小蒋观天下6 小时前
社区AI智能摄像头完整选型指南
大数据·人工智能·安全·计算机视觉·语音识别·ai大模型
AI 思录7 小时前
Prompt 事故档案(八):日常表达被标为“待校准”,AI 的爹味语法从哪里来
大数据·人工智能·算法·prompt·用户体验·ai合规
瀚高PG实验室7 小时前
使用pg_stat_statements抓取数据库TOP SQL
数据库·sql·postgresql·瀚高数据库
2601_965742228 小时前
全媒体运营与短视频代运营,两者有什么区别?
大数据·数据结构·人工智能·算法·ai·媒体