【Hive SQL 每日一题】在线课程学生行为数据分析

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 该数据分析师任务是分析在线学习平台的学生行为,以优化课程内容和学习体验。提供的数据包括`students`表(含学生ID、姓名、年龄和性别)和`course_activity`表(含活动ID、学生ID、课程ID、活动日期和学习时长)。分析涉及:1) 学生参加的课程数量,2) 课程总学习时长,3) 按性别分组的平均学习时长,4) 学生首次参加的课程及日期,5) 学生最近一次学习的时长,以及6) 参与学生最多的课程。所有查询都使用了SQL,部分涉及窗口函数和分组统计。数据集可在给定链接下载。

需求描述

假设你是一位数据分析师,负责分析某在线学习平台的学生行为数据,平台上有多个课程,学生可以在不同的日期参加不同的课程,请你完成相关业务分析,帮助平台优化课程内容和学生学习体验。

数据准备

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

students

记录学生的信息

字段名 字段类型 备注
student_id int 学生ID
name string 学生姓名
age int 学生年龄
gender string 学生性别

示例数据:

student_id name age gender
1 'Alice' 23 'F'
2 'Bob' 22 'M'
3 'Cathy' 24 'F'
4 'David' 23 'M'
5 'Eve' 25 'F'

course_activity

记录学生的在线学习课程的数据

字段名 字段类型 备注
activity_id int 活动ID
student_id int 学生ID
course_id int 课程ID
activity_date string 活动日期
duration int 学习时长(分钟)

示例数据:

activity_id student_id course_id activity_date duration
101 1 1001 '2024-01-01' 30
102 1 1002 '2024-01-01' 45
103 2 1001 '2024-01-02' 20
104 3 1001 '2024-01-03' 25
105 3 1003 '2024-01-04' 60
106 4 1002 '2024-01-02' 40
107 5 1001 '2024-01-03' 50
108 5 1002 '2024-01-04' 30

数据集 SQL 下载

需求分析与实现

1.每个学生参加的课程数量

select
    student_id,
    count(distinct course_id) course_num
from
    course_activity
group by
    student_id
order by
    student_id;

image.png

解题思路

  1. 按学生ID进行分组,统计课程ID的数量;

  2. 在统计时需要去重,因为学生在学习同一门课程时会存在多条记录。

2.每个课程的总学习时长

select
    course_id,
    sum(duration) total_minutes
from
    course_activity
group by
    course_id
order by
    course_id;

image.png

解题思路

  • 按课程ID进行分组,根据学习时长累加求和。

3.按性别分组的平均学习时长

select
    gender,
    cast(gender_duration / gender_count as decimal(6,0)) avg_duration
from
    (select
        gender,
        sum(duration) gender_duration,
        count(distinct ca.student_id) gender_count
    from
        course_activity ca
    join
        students si
    on
        si.student_id = ca.student_id
    group by
        gender)t1;

image.png

解题思路

  • 根据学生ID对两个表进行 join 操作;

  • 按学生性别进行分组,对学习时长累加求和,并统计学生数量;

  • 计算每组的平均学习时长。

4.每个学生首次参加的课程及其日期

select
    student_id,
    course_id,
    activity_date
from
    (select
        student_id,
        course_id,
        activity_date,
        min(activity_date) over(partition by student_id) min_activity_date
    from
        course_activity)t1
where
    activity_date = min_activity_date
order by
    student_id;

image.png

解题思路

  • 利用窗口函数分组取每名学生最早的学习日期;

  • 通过获取到的日期进行等值过滤,最终得到结果。

注意,在这里会出现一名学生首日参加多条数据的情况,但由于时间字段没有记录时分秒,无法界定哪条数据先产生,所以这里将首日的数据都进行了保留。如果想要仅保留一条数据,可以把 min 换成 rank 窗口排序,然后将过滤条件设置为 rank=1 即可。

5.每个学生最近一次参加课程的持续时间

select
    student_id,
    duration
from
    (select
        student_id,
        activity_date,
        duration,
        max(activity_date) over(partition by student_id) max_activity_date
    from
        course_activity)t1
where
    activity_date = max_activity_date
order by
    student_id;

image.png

解题思路

  • 利用窗口函数分组取每名学生距今最近的学习日期;

  • 通过获取到的日期进行等值过滤,最终得到结果。

这个需求和上面的需求类似,反过来而已。

6.活跃度最高的课程(按参与学生人数计)

select
    course_id,
    stu_count
from
    (select
        course_id,
        count(distinct student_id) stu_count
    from
        course_activity
    group by
        course_id)t1
order by
    stu_count desc
limit 1;

image.png

解题思路

  • 按课程ID分组去重统计学习该课的人数;

  • 通过全局降序排列,取前 1 条数据,获取到活跃度最高的课程。

相关文章
|
1月前
|
SQL 分布式计算 Hadoop
Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL
Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL
60 3
|
1月前
|
SQL 分布式计算 Java
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
34 0
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
84 0
|
3月前
|
SQL 数据挖掘
7张图总结:SQL 数据分析常用语句!
7张图总结:SQL 数据分析常用语句!
|
3月前
|
SQL 存储 分布式计算
插入Hive表数据SQL
【8月更文挑战第10天】
|
3月前
|
SQL 物联网 数据处理
"颠覆传统,Hive SQL与Flink激情碰撞!解锁流批一体数据处理新纪元,让数据决策力瞬间爆表,你准备好了吗?"
【8月更文挑战第9天】数据时代,实时性和准确性至关重要。传统上,批处理与流处理各司其职,但Apache Flink打破了这一界限,尤其Flink与Hive SQL的结合,开创了流批一体的数据处理新时代。这不仅简化了数据处理流程,还极大提升了效率和灵活性。例如,通过Flink SQL,可以轻松实现流数据与批数据的融合分析,无需在两者间切换。这种融合不仅降低了技术门槛,还为企业提供了更强大的数据支持,无论是在金融、电商还是物联网领域,都将发挥巨大作用。
60 6
|
3月前
|
SQL 数据挖掘 关系型数据库
|
3月前
|
SQL 数据挖掘 Serverless
SQL 窗口函数简直太厉害啦!复杂数据分析的超强利器,带你轻松攻克数据难题,快来一探究竟!
【8月更文挑战第31天】在数据驱动时代,高效处理和分析大量数据至关重要。SQL窗口函数可对一组行操作并返回结果集,无需分组即可保留原始行信息。本文将介绍窗口函数的分类、应用场景及最佳实践,助您掌握这一强大工具。例如,在销售数据分析中,可使用窗口函数计算累计销售额和移动平均销售额,更好地理解业务趋势。
64 0
|
3月前
|
SQL 数据可视化 数据挖掘
SQL 在数据分析中简直太牛啦!从数据提取到可视化,带你领略强大数据库语言的神奇魅力!
【8月更文挑战第31天】在数据驱动时代,SQL(Structured Query Language)作为强大的数据库查询语言,在数据分析中扮演着关键角色。它不仅能够高效准确地提取所需数据,还能通过丰富的函数和操作符对数据进行清洗与转换,确保其适用于进一步分析。借助 SQL 的聚合、分组及排序功能,用户可以从多角度深入分析数据,为企业决策提供有力支持。尽管 SQL 本身不支持数据可视化,但其查询结果可轻松导出至 Excel、Python、R 等工具中进行可视化处理,帮助用户更直观地理解数据。掌握 SQL 可显著提升数据分析效率,助力挖掘数据价值。
68 0