【Hive SQL 每日一题】分析电商平台的用户行为和订单数据

news2025/1/11 0:04:07

需求描述

假设你是一位数据分析师,负责分析某电商平台的用户行为和订单数据,平台上有多个用户,用户可以在不同的日期下单,每个订单包含多个商品。请你完成相关业务分析,帮助平台优化运营策略和用户体验。

数据准备

我们有三张表,表的字段信息如下:

users

记录用户的信息

字段名字段类型备注
user_idint用户ID
namestring用户姓名
ageint用户年龄
genderstring用户性别
register_datestring注册日期

示例数据:

user_idnameagegenderregister_date
1‘Alice’23‘F’‘2023-01-01’
2‘Bob’22‘M’‘2023-02-01’
3‘Cathy’24‘F’‘2023-03-01’
4‘David’23‘M’‘2023-04-01’
5‘Eve’25‘F’‘2023-05-01’

orders

记录订单的信息

字段名字段类型备注
order_idint订单ID
user_idint用户ID
order_datestring订单日期
amountdouble订单金额

示例数据:

order_iduser_idorder_dateamount
1011‘2024-01-01’100.0
1021‘2024-01-02’150.0
1032‘2024-01-03’200.0
1043‘2024-01-04’50.0
1054‘2024-01-05’300.0
1065‘2024-01-06’250.0

order_items

记录订单中商品的信息

字段名字段类型备注
order_item_idint订单项ID
order_idint订单ID
product_idint商品ID
quantityint商品数量
pricedouble商品单价

示例数据:

order_item_idorder_idproduct_idquantityprice
10011011150.0
10021012150.0
10031023350.0
100410342100.0
10051045150.0
100610562150.0
10071067550.0

数据集

-- 创建用户表
CREATE TABLE users (
    user_id INT,
    name STRING,
    age INT,
    gender STRING,
    register_date STRING
);

-- 插入用户数据
INSERT INTO users VALUES
(1, 'Alice', 23, 'F', '2023-01-01'),
(2, 'Bob', 22, 'M', '2023-02-01'),
(3, 'Cathy', 24, 'F', '2023-03-01'),
(4, 'David', 23, 'M', '2023-04-01'),
(5, 'Eve', 25, 'F', '2023-05-01'),
(6, 'Frank', 28, 'M', '2023-06-01'),
(7, 'Grace', 27, 'F', '2023-07-01'),
(8, 'Hank', 26, 'M', '2023-08-01'),
(9, 'Ivy', 29, 'F', '2023-09-01'),
(10, 'Jack', 30, 'M', '2023-10-01');

-- 创建订单表
CREATE TABLE orders (
    order_id INT,
    user_id INT,
    order_date STRING,
    amount DOUBLE
);

-- 插入订单数据
INSERT INTO orders VALUES
(101, 1, '2024-01-01', 100.0),
(102, 1, '2024-01-02', 150.0),
(103, 2, '2024-01-03', 200.0),
(104, 3, '2024-01-04', 50.0),
(105, 4, '2024-01-05', 300.0),
(106, 5, '2024-01-06', 250.0),
(107, 6, '2024-01-07', 100.0),
(108, 7, '2024-01-08', 150.0),
(109, 8, '2024-01-09', 200.0),
(110, 9, '2024-01-10', 50.0),
(111, 10, '2024-01-11', 300.0),
(112, 1, '2024-01-12', 100.0),
(113, 2, '2024-01-13', 150.0),
(114, 3, '2024-01-14', 200.0),
(115, 4, '2024-01-15', 50.0),
(116, 5, '2024-01-16', 300.0),
(117, 6, '2024-01-17', 250.0),
(118, 7, '2024-01-18', 100.0),
(119, 8, '2024-01-19', 150.0),
(120, 9, '2024-01-20', 200.0);

-- 创建订单项表
CREATE TABLE order_items (
    order_item_id INT,
    order_id INT,
    product_id INT,
    quantity INT,
    price DOUBLE
);

-- 插入订单项数据
INSERT INTO order_items VALUES
(1001, 101, 1, 1, 50.0),
(1002, 101, 2, 1, 50.0),
(1003, 102, 3, 3, 50.0),
(1004, 103, 4, 2, 100.0),
(1005, 104, 5, 1, 50.0),
(1006, 105, 6, 2, 150.0),
(1007, 106, 7, 5, 50.0),
(1008, 107, 1, 2, 50.0),
(1009, 108, 2, 3, 50.0),
(1010, 109, 3, 1, 50.0),
(1011, 110, 4, 2, 100.0),
(1012, 111, 5, 1, 50.0),
(1013, 112, 6, 2, 150.0),
(1014, 113, 7, 5, 50.0),
(1015, 114, 1, 2, 50.0),
(1016, 115, 2, 3, 50.0),
(1017, 116, 3, 1, 50.0),
(1018, 117, 4, 2, 100.0),
(1019, 118, 5, 1, 50.0),
(1020, 119, 6, 2, 150.0),
(1021, 120, 7, 5, 50.0);

需求分析与实现

1.计算每个用户的总订单金额和订单数量,并根据总订单金额对用户进行排名

select
    user_id,
    total_amount,
    total_cnt,
    rank() over(order by total_amount desc) rk
from
    (select
        user_id,
        sum(amount) total_amount,
        count(order_id) total_cnt
    from
        orders
    group by
        user_id)t1;

在这里插入图片描述

解题思路

  1. 按用户ID进行分组,统计每个用户的总订单金额和订单数量;
  2. 使用 RANK() 窗口函数对用户进行排名。

2.按月统计每个用户的订单总金额和订单数量

select
    user_id,
    date_format(order_date,"yyyy-MM") order_month,
    sum(amount) total_amount,
    count(order_id) total_cnt
from
    orders
group by
    user_id,date_format(order_date,"yyyy-MM");

在这里插入图片描述

解题思路

  1. 使用 DATE_FORMAT() 函数按月提取订单日期;
  2. 按用户ID和月份进行分组,统计每个用户每月的订单总金额和订单数量。

3.分析每个用户最常购买的商品,并计算该商品的总购买次数和总金额

select
    user_id,
    product_id,
    total_amount,
    total_cnt
from
    (select
        user_id,
        product_id,
        total_amount,
        total_cnt,
        row_number() over(partition by user_id order by total_cnt desc) rn
    from
        (select
            user_id,
            product_id,
            sum(amount) total_amount,
            count(product_id) total_cnt
        from
            orders o
        join
            order_items oi
        on
            o.order_id = oi.order_id
        group by
            user_id,product_id)t1 )t2
where
    rn = 1;

在这里插入图片描述

解题思路

  1. 分组统计每个用户购买商品的次数和总金额;
  2. 使用 ROW_NUMBER() 窗口函数对每个用户购买的商品进行排序;
  3. 过滤出购买次数最多的商品。

4.分别找出平均每月订单金额最高与订单数量最高的用户

select
    user_id,
    order_month,
    avg_amount,
    order_cnt
from
    (select
        user_id,
        order_month,
        avg_amount,
        order_cnt,
        rank() over(order by avg_amount desc) rk_amount,
        rank() over(order by order_cnt desc) rk_cnt
    from
        (select
            user_id,
            date_format(order_date,"yyyy-MM") order_month,
            cast(avg(amount) as decimal(5,2)) avg_amount,
            count(order_id) order_cnt
        from
            orders
        group by
            user_id,
            date_format(order_date,"yyyy-MM"))t1 )t2
where
    rk_amount = 1 or rk_cnt = 1;

在这里插入图片描述

解题思路

  1. 统计每个用户每月的平均订单金额和订单数量;

  2. 排序并取出平均每月订单金额和订单数量最高的两个用户。

5.找出订单金额最高的前10名用户,并分析这些用户的年龄和性别分布

select
    u.user_id,
    total_amount,
    u.age,
    u.gender
from
    (select
        user_id,
        sum(amount) total_amount
    from
        orders
    group by
        user_id) o
join
    users u
on
    o.user_id = u.user_id
order by
    total_amount desc
limit
    10;

在这里插入图片描述

解题思路

  1. 分组统计每个用户的总订单金额;
  2. 联合 users 表,获取用户的年龄和性别信息;
  3. 排序并取出总订单金额最高的前10名用户。

6.找出在过去一年内注册的用户中,订单金额最高的前5名用户

select
    u.user_id,
    sum(amount) total_amount
from
    (select
        user_id
    from
        users
    where
        register_date >= date_sub(current_date(),365) )u
join
    orders o
on
    o.user_id = u.user_id
group by
    u.user_id
order by
    total_amount desc
limit
    5;

在这里插入图片描述

解题思路

  1. 筛选出过去一年内注册的用户;
  2. 联合 orders 表,统计这些用户的总订单金额;
  3. 通过排序获取出前 5 名用户,如果想要精准获取允许重复,则可以使用 rank 或者 row_number 进行窗口排序后过滤获取前 5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1684097.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

音视频-常用的分析工具介绍-连续补充

目录 1:Audacity 2:MediaInfo 3:MP4Box 4:hexinator 5:Adobe Audition 6:VideoEye 7:YUVplayer (YUV/RGB播放器) 在做音视频分析时,经常用到各种分析工…

Sentinel的隔离和降级

文章目录 1、概念简介2、FeignClient整合Sentinel2.1、修改配置,开启sentinel功能2.2、编写失败降级逻辑2.3、总结 3、线程隔离(舱壁模式)3.1、线程隔离的实现方式3.2、sentinel的线程隔离1)配置隔离规则2)Jmeter测试 …

flink程序本地运行报: A JNI error has occurred和java.lang.NoClassDefFoundError

1.问题描述 在idea中运行flink job程序出现如下错误: Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/flink/api/common/io/FileInputFormat …

Excel模板计算得出表格看板

背景 表格看板及导出,单元格时间年是根据筛选器时间变化的 较往年和往年是计算单元格 思路 1.通过excel模板来把数据填入excel再数据清洗得到数据返回前端 2.数据填充,通过行列作为key 列如:key整体20241月,根据key匹配数据填…

资料防拷贝该如何实现?数据防拷贝的方法有哪些

数据安全和隐私保护成为企业和个人关注的重点。电脑中存储的资料往往包含了重要的商业机密、个人隐私或其他敏感信息。 因此,如何有效防止他人非法拷贝电脑资料,成为了一个亟待解决的问题。 本文将探讨数据防拷贝的方法,以帮助企业和个人保护…

linux查看硬盘信息

1、查看挂接的分区状态 [rootMaster ~]# fdisk -l |grep Disk 2、查看硬盘和分区分布 [rootMaster ~]# lsblk 3、查看硬盘和分区的详细信息 [rootMaster ~]# fdisk -l 4、查看挂接的分区状态 [rootMaster ~]# swapon -s 5、查看硬盘使用情况 [rootMaster ~]# df -hT 6、硬…

Mysql总结1

Mysql常见日志 (1)错误日志:记录数据库服务器启动、停止、运行时存在的问题; (2)慢查询日志:记录查询时间超过long_query_time的sql语句,其中long_query_time可配置,且…

docker所在磁盘空间不足 迁移数据

1.查看原始目录docker info | grep "Docker Root Dir" 一般在/var/lib/docker 2.停止docker service docekr stop 3.移动数据 注意 移动前不要创建docker目录! mv /var/lib/docker /home/docker 4.进入目录查看是否与原始目录相同,确认一…

精准键位提示,键盘盲打轻松入门

在说明精准键位提示之前,我们先来看一张图: 这是一张标准的基准键位图,也就是打字时我们双手的8个手指放在基准键位上,在打不同的字母时,我们的手指以基准键位为中心,或上、或下、或左、或右,在…

全域运营是本地生活的下半场?新的创业风口来了?

随着全域概念的兴起,全域运营赛道也逐渐进入人们的视野之中,甚至有业内人士预测,全域运营将会是本地生活下半场的大趋势。 之所以这么说,是因为全域运营作为包含了公域和私域内所有运营业务的新模式,不仅能同时做所有本…

楼道堆积物视觉识别监控系统

楼道堆积物视觉识别监控系统采用了AI神经网络和深度学习算法,楼道堆积物视觉识别监控系统通过摄像头实时监测楼道的情况,通过图像处理、物体识别和目标跟踪算法,系统能够精确地识别楼道通道是否被堆积物阻塞。楼道堆积物视觉识别监控系统检测…

RA-RISK ANALYSIS

文章目录 一、期刊简介二、征稿信息三、期刊表现四、投稿须知五、咨询 一、期刊简介 Risk Analysis代表风险分析学会出版,在ISI期刊引文报告中的社会科学、数学方法类别中排名前10位,为风险分析领域的新发展提供了焦点。这本国际同行评审期刊致力于发表…

面试准备【面试准备】

面试准备【面试准备】 前言面试准备自我介绍:项目介绍: 论坛项目功能总结数据库表设计注册功能登录功能显示登录信息功能发布帖子评论私信点赞功能关注功能通知搜索网站数据统计热帖排行缓存 论坛项目技术总结Http的无状态cookie和session的区别为什么要…

Python TCP编程简单实例

客户端:创建TCP链接时,主动发起连接的叫做客户端 服务端:接收客户端的连接 连接其他服务器 可以通过tcp连接其他服务器。 示例: import socket# 1.创建一个socket # 参数1:指定协议 AF_INET(ipv4&#…

TSMaster发送CAN报文

打开TSMaster工程 从菜单栏打开CAN报文发送窗口:【分析】->【报文发送】->【添加CAN/CAN FD发送】 可以选择【从CAN数据库添加报文】或者是【添加新的原始报文】 方法一 添加新的原始报文 可以配置报文发送的触发方式,有【手动】和【周期】两种。…

Linux多线程系列三: 生产者消费者模型,信号量使用,基于阻塞队列和环形队列的这两种生产者消费者代码的实现

Linux多线程系列三: 生产者消费者模型,信号量,基于阻塞队列和环形队列的这两种生产者消费者代码的实现 一.生产者消费者模型的理论1.现实生活中的生产者消费者模型2.多线程当中的生产者消费者模型3.理论 二.基于阻塞队列的生产者消费者模型的基础代码1.阻塞队列的介绍2.大致框架…

力扣刷题--2733. 既不是最小值也不是最大值【简单】

题目描述 给你一个整数数组 nums ,数组由 不同正整数 组成,请你找出并返回数组中 任一 既不是 最小值 也不是 最大值 的数字,如果不存在这样的数字,返回 -1 返回所选整数。 示例 1: 输入:nums [3,2,1,…

docker三种自定义网络(虚拟网络) overlay实现原理

docker提供了三种自定义网络驱动:bridge、overlay、macvlan。 bridge驱动类似默认的bridge网络模式。 overlay和macvlan是用于创建跨主机网络。 支持自定义网段、网关,docker network create --subnet 172.77.0.0/24 --gateway 172.77.0.1 my_n…

Mujoco仿真【xml文件的学习 3】

在学习Mujoco仿真的过程中,为了与时俱进,之前的mujoco210版本不再使用,改用了mujoco-3.1.4版本,下面继续mujoco仿真的学习! 先前关于mujoco的学习博客汇总如下: 强化学习:MuJoCo机器人强化学习…

基于深度学习OCR文本识别

第一步:概要 基于深度学习OCR文本识别分为两个模块:DBNet和CRNN。 DBNet是基于分割的文本检测算法,算法将可微分二值化模块(Differentiable Binarization)引入了分割模型,使得模型能够通过自适应的阈值图进行二值化,并…