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

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,5000CU*H 3个月
简介: 该数据分析师任务是分析在线学习平台的学生行为,以优化课程内容和学习体验。提供的数据包括`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 条数据,获取到活跃度最高的课程。

相关文章
|
4天前
|
SQL 数据挖掘 数据库
这可能是最适合解决 SQL 数据分析痛点的编程语言
数据分析师常需处理各种数据操作,如过滤、分组、汇总等,SQL 在这些基本需求上表现得心应手。然而,面对本地文件数据或更复杂需求时,SQL 的局限性显现。SPL(Structured Process Language)则提供了更灵活的解决方案,无需数据库环境,直接从文件计算,代码简洁易懂,调试工具强大,极大提升了数据分析的效率和交互性。
|
1月前
|
SQL 数据挖掘 Python
数据分析编程:SQL,Python or SPL?
数据分析编程用什么,SQL、python or SPL?话不多说,直接上代码,对比明显,明眼人一看就明了:本案例涵盖五个数据分析任务:1) 计算用户会话次数;2) 球员连续得分分析;3) 连续三天活跃用户数统计;4) 新用户次日留存率计算;5) 股价涨跌幅分析。每个任务基于相应数据表进行处理和计算。
|
2月前
|
SQL 分布式计算 Hadoop
Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL
Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL
79 3
|
2月前
|
SQL 分布式计算 Java
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
56 0
|
2月前
|
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
103 0
|
4月前
|
SQL 数据挖掘
7张图总结:SQL 数据分析常用语句!
7张图总结:SQL 数据分析常用语句!
|
4月前
|
SQL 存储 分布式计算
插入Hive表数据SQL
【8月更文挑战第10天】
|
4月前
|
SQL 物联网 数据处理
"颠覆传统,Hive SQL与Flink激情碰撞!解锁流批一体数据处理新纪元,让数据决策力瞬间爆表,你准备好了吗?"
【8月更文挑战第9天】数据时代,实时性和准确性至关重要。传统上,批处理与流处理各司其职,但Apache Flink打破了这一界限,尤其Flink与Hive SQL的结合,开创了流批一体的数据处理新时代。这不仅简化了数据处理流程,还极大提升了效率和灵活性。例如,通过Flink SQL,可以轻松实现流数据与批数据的融合分析,无需在两者间切换。这种融合不仅降低了技术门槛,还为企业提供了更强大的数据支持,无论是在金融、电商还是物联网领域,都将发挥巨大作用。
64 6
|
4月前
|
前端开发 Java JSON
Struts 2携手AngularJS与React:探索企业级后端与现代前端框架的完美融合之道
【8月更文挑战第31天】随着Web应用复杂性的提升,前端技术日新月异。AngularJS和React作为主流前端框架,凭借强大的数据绑定和组件化能力,显著提升了开发动态及交互式Web应用的效率。同时,Struts 2 以其出色的性能和丰富的功能,成为众多Java开发者构建企业级应用的首选后端框架。本文探讨了如何将 Struts 2 与 AngularJS 和 React 整合,以充分发挥前后端各自优势,构建更强大、灵活的 Web 应用。
63 0
下一篇
DataWorks