常见大数据面试SQL-每年总成绩都有所提升的学生

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,1000CU*H 3个月
简介: 一张学生成绩表(student_scores),有year-学年,subject-课程,student-学生,score-分数这四个字段,请完成如下问题:问题1:每年每门学科排名第一的学生问题2:每年总成绩都有所提升的学生

一、题目

一张学生成绩表(student_scores),有year-学年,subject-课程,student-学生,score-分数这四个字段,请完成如下问题:

问题1:每年每门学科排名第一的学生

问题2:每年总成绩都有所提升的学生

数据内容如下

+-------+----------+----------+--------+
| year  | subject  | student  | score  |
+-------+----------+----------+--------+
| 2018  | 语文       | A        | 84     |
| 2018  | 数学       | A        | 59     |
| 2018  | 英语       | A        | 30     |
| 2018  | 语文       | B        | 44     |
| 2018  | 数学       | B        | 76     |
| 2018  | 英语       | B        | 68     |
| 2019  | 语文       | A        | 51     |
| 2019  | 数学       | A        | 94     |
| 2019  | 英语       | A        | 71     |
| 2019  | 语文       | B        | 87     |
| 2019  | 数学       | B        | 44     |
| 2019  | 英语       | B        | 38     |
| 2020  | 语文       | A        | 91     |
| 2020  | 数学       | A        | 50     |
| 2020  | 英语       | A        | 89     |
| 2020  | 语文       | B        | 81     |
| 2020  | 数学       | B        | 84     |
| 2020  | 英语       | B        | 98     |
+-------+----------+----------+--------+

二、分析

  1. 题目1查询每年每科分数最高的学生,开窗函数考察;可以使用row_number(),rank() 等,由于使用这两个太多,这次使用first_value();
  2. 题目2每年总成绩都有提升,首先是计算每年的成绩,聚合函数sum();然后使用有序计算开窗函数lag()得出上一年分数;
  3. 去掉第一年的数据,即lag()产出结果为空的行;
  4. 本年分数进行比较得出本年是否有进步;
  5. “取全”,要求行数与符合条件行数相同;
  6. 两个问题整体考察了多个开窗函数,考察了“取全部“的逻辑处理,聚合函数;
维度 评分
题目难度 ⭐️⭐️⭐️⭐️
题目清晰度 ⭐️⭐️⭐️⭐️⭐
业务常见度 ⭐️⭐️⭐️⭐️

三、SQL

问题1:每年每门学科排名第一的学生

1.按照年份、学科分组,按照分数排序,计算出相同年份,相同学科排名第一的人,添加到本行

执行SQL

--计算排名第一的人
select year,
       subject,
       student,
       score,
       first_value(student) over (partition by year,subject order by score desc) as first_student
from t_student_scores

查询结果

+-------+----------+----------+--------+----------------+
| year  | subject  | student  | score  | first_student  |
+-------+----------+----------+--------+----------------+
| 2018  | 数学       | B        | 76     | B              |
| 2018  | 数学       | A        | 59     | B              |
| 2018  | 英语       | B        | 68     | B              |
| 2018  | 英语       | A        | 30     | B              |
| 2018  | 语文       | A        | 84     | A              |
| 2018  | 语文       | B        | 44     | A              |
| 2019  | 数学       | A        | 94     | A              |
| 2019  | 数学       | B        | 44     | A              |
| 2019  | 英语       | A        | 71     | A              |
| 2019  | 英语       | B        | 38     | A              |
| 2019  | 语文       | B        | 87     | B              |
| 2019  | 语文       | A        | 51     | B              |
| 2020  | 数学       | B        | 84     | B              |
| 2020  | 数学       | A        | 50     | B              |
| 2020  | 英语       | B        | 98     | B              |
| 2020  | 英语       | A        | 89     | B              |
| 2020  | 语文       | A        | 91     | A              |
| 2020  | 语文       | B        | 81     | A              |
+-------+----------+----------+--------+----------------+

2.去重,计算出最终结果

执行SQL

select year,
       subject,
       first_student
from (select year, 
             subject, 
             first_value(student) over (partition by year,subject order by score desc) as first_student
      from t_student_scores) t
group by year, subject, first_student

查询结果

+-------+----------+----------------+
| year  | subject  | first_student  |
+-------+----------+----------------+
| 2018  | 数学       | B              |
| 2018  | 英语       | B              |
| 2018  | 语文       | A              |
| 2019  | 数学       | A              |
| 2019  | 英语       | A              |
| 2019  | 语文       | B              |
| 2020  | 数学       | B              |
| 2020  | 英语       | B              |
| 2020  | 语文       | A              |
+-------+----------+----------------+

问题2:每年总成绩都有所提升的学生

1.计算每年每个学生的总成绩

执行SQL

--每年每个学生总成绩
select year, student, sum(score) as total_score
from t_student_scores
group by year, student

查询结果

+-------+----------+--------------+
| year  | student  | total_score  |
+-------+----------+--------------+
| 2018  | A        | 173          |
| 2018  | B        | 188          |
| 2019  | A        | 216          |
| 2019  | B        | 169          |
| 2020  | A        | 230          |
| 2020  | B        | 263          |
+-------+----------+--------------+

2.使用lag函数,在本行添加上一学年成绩

执行SQL

select year,
       student,
       total_score,
       lag(total_score) over (partition by student order by year) as last_year_score
from (select year, student, sum(score) as total_score
      from t_student_scores
      group by year, student) t

查询结果

+-------+----------+--------------+------------------+
| year  | student  | total_score  | last_year_score  |
+-------+----------+--------------+------------------+
| 2018  | A        | 173          | NULL             |
| 2019  | A        | 216          | 173              |
| 2020  | A        | 230          | 216              |
| 2018  | B        | 188          | NULL             |
| 2019  | B        | 169          | 188              |
| 2020  | B        | 263          | 169              |
+-------+----------+--------------+------------------+

3.剔除lag()结果字段为空数据,然后比较判断是否有进步

执行SQL

select year,
       student,
       total_score,
       last_year_score,
       if(total_score > last_year_score, 1, 0) as improve_flag
from (select year,
             student,
             total_score,
             lag(total_score) over (partition by student order by year) as last_year_score
      from (select year, student, sum(score) as total_score
            from t_student_scores
            group by year, student) t) t1
where last_year_score is not null

查询结果

+-------+----------+--------------+------------------+---------------+
| year  | student  | total_score  | last_year_score  | improve_flag  |
+-------+----------+--------------+------------------+---------------+
| 2019  | A        | 216          | 173              | 1             |
| 2020  | A        | 230          | 216              | 1             |
| 2019  | B        | 169          | 188              | 0             |
| 2020  | B        | 263          | 169              | 1             |
+-------+----------+--------------+------------------+---------------+

4.取每年进步

执行SQL

-- 是否有进步明细
with t_improve as
         (select year,
                 student,
                 total_score,
                 last_year_score,
                 if(total_score > last_year_score, 1, 0) as improve_flag
          from (select year,
                       student,
                       total_score,
                       lag(total_score) over (partition by student order by year) as last_year_score
                from (select year, student, sum(score) as total_score
                      from t_student_scores
                      group by year, student) t) t1
          where last_year_score is not null)
select student
from t_improve
group by student
having count(1) = sum(improve_flag)

查询结果

+----------+
| student  |
+----------+
| A        |
+----------+

四、建表语句和数据插入

-- 建表语句
CREATE TABLE t_student_scores
(
year STRING,
subject STRING,
student STRING,
score INT )
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
-- 数据插入语句
INSERT INTO t_student_scores
(year, subject, student, score) VALUES
(2018, '语文', 'A', 84),
(2018, '数学', 'A', 59),
(2018, '英语', 'A', 30),
(2018, '语文', 'B', 44),
(2018, '数学', 'B', 76),
(2018, '英语', 'B', 68),
(2019, '语文', 'A', 51),
(2019, '数学', 'A', 94),
(2019, '英语', 'A', 71),
(2019, '语文', 'B', 87),
(2019, '数学', 'B', 44),
(2019, '英语', 'B', 38),
(2020, '语文', 'A', 91),
(2020, '数学', 'A', 50),
(2020, '英语', 'A', 89),
(2020, '语文', 'B', 81),
(2020, '数学', 'B', 84),
(2020, '英语', 'B', 98);

本文首发数据仓库技术网站常见大数据面试SQL-每年总成绩都有所提升的学生

相关实践学习
基于MaxCompute的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
相关文章
|
2月前
|
SQL 存储 分布式计算
【万字长文,建议收藏】《高性能ODPS SQL章法》——用古人智慧驾驭大数据战场
本文旨在帮助非专业数据研发但是有高频ODPS使用需求的同学们(如数分、算法、产品等)能够快速上手ODPS查询优化,实现高性能查数看数,避免日常工作中因SQL任务卡壳、失败等情况造成的工作产出delay甚至集群资源稳定性问题。
894 36
【万字长文,建议收藏】《高性能ODPS SQL章法》——用古人智慧驾驭大数据战场
|
3月前
|
SQL 分布式计算 大数据
SparkSQL 入门指南:小白也能懂的大数据 SQL 处理神器
在大数据处理的领域,SparkSQL 是一种非常强大的工具,它可以让开发人员以 SQL 的方式处理和查询大规模数据集。SparkSQL 集成了 SQL 查询引擎和 Spark 的分布式计算引擎,使得我们可以在分布式环境下执行 SQL 查询,并能利用 Spark 的强大计算能力进行数据分析。
|
5月前
|
SQL 人工智能 分布式计算
别再只会写SQL了!这五个大数据趋势正在悄悄改变行业格局
别再只会写SQL了!这五个大数据趋势正在悄悄改变行业格局
75 0
|
7月前
|
SQL 机器学习/深度学习 数据挖掘
【Uber 面试真题】SQL :每个星期连续5星评价最多的司机
本文是【SQL周周练】系列的第一篇,作者“蒋点数分”分享了一道来自Uber面试的真题及其解法。题目要求找出每周连续获得5星好评最多的司机ID。文章详细解析了利用SQL窗口函数解决“连续”问题的思路,并通过Python和NumPy生成模拟数据,最终提供Hive SQL解答方案。后续还将涉及Streamlit应用、时间序列分析、AB实验设计等内容,欢迎关注。
191 16
|
7月前
|
SQL 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。
|
7月前
|
关系型数据库 MySQL 大数据
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
|
8月前
|
SQL 大数据 数据挖掘
玩转大数据:从零开始掌握SQL查询基础
玩转大数据:从零开始掌握SQL查询基础
300 35
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
12月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?

相关产品

  • 云原生大数据计算服务 MaxCompute