前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >开窗函数-计算每个学生总成绩相差5分以内同学的各科平均成绩

开窗函数-计算每个学生总成绩相差5分以内同学的各科平均成绩

作者头像
数据仓库晨曦
发布于 2025-04-14 03:03:48
发布于 2025-04-14 03:03:48
8400
代码可运行
举报
文章被收录于专栏:数据仓库技术数据仓库技术
运行总次数:0
代码可运行

题目

现有学生成绩表(t_scores) 包含学生id、语文、数学、成绩,现为对比总分成绩差不多的学生其各科成绩表现水平,计算出与自己总分相差5分以内(+-5)的同学各科平均分;

样例数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+-------------+----------+-------+
| student_id  | chinese  | math  |
+-------------+----------+-------+
| 1           | 93       | 85    |
| 2           | 81       | 96    |
| 3           | 88       | 82    |
| 4           | 79       | 77    |
| 5           | 85       | 76    |
| 6           | 69       | 85    |
| 7           | 77       | 90    |
| 8           | 79       | 81    |
+-------------+----------+-------+

期望结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+-------------+----------+-------+--------+--------------+-----------+
| student_id  | chinese  | math  | total  | avg_chinese  | avg_math  |
+-------------+----------+-------+--------+--------------+-----------+
| 1           | 93       | 85    | 178    | 87.0         | 90.5      |
| 2           | 81       | 96    | 177    | 87.0         | 90.5      |
| 3           | 88       | 82    | 170    | 82.5         | 86.0      |
| 4           | 79       | 77    | 156    | 78.0         | 79.75     |
| 5           | 85       | 76    | 161    | 81.0         | 78.0      |
| 6           | 69       | 85    | 154    | 74.0         | 81.0      |
| 7           | 77       | 90    | 167    | 82.5         | 86.0      |
| 8           | 79       | 81    | 160    | 81.0         | 78.0      |
+-------------+----------+-------+--------+--------------+-----------+

建表语句及数据插入语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE t_scores (
    student_id BIGINT,
    chinese BIGINT,
    math BIGINT
);

INSERT INTO t_scores VALUES
(1, 93, 85),
(2, 81, 96),
(3, 88, 82),
(4, 79, 77),
(5, 85, 76),
(6, 69, 85),
(7, 77, 90),
(8, 79, 81);

分析

本题是对开窗函数的考察,但是窗口的范围不是固定行数,而是根据总分数的值进行判断,所以需要用到不常用的range方式,属于考察知识范围的题目,知道就很简单,不知道就比较费劲了。

执行SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select student_id,
       chinese,
       math,
       chinese + math                                 as total,
       avg(chinese) over (ORDER BY chinese + math
           RANGE BETWEEN 5 PRECEDING AND 5 FOLLOWING) as avg_chinese,
       avg(math) over (ORDER BY chinese + math
           RANGE BETWEEN 5 PRECEDING AND 5 FOLLOWING) as avg_math
from t_scores

执行结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+-------------+----------+-------+--------+--------------+-----------+
| student_id  | chinese  | math  | total  | avg_chinese  | avg_math  |
+-------------+----------+-------+--------+--------------+-----------+
| 6           | 69       | 85    | 154    | 74.0         | 81.0      |
| 4           | 79       | 77    | 156    | 78.0         | 79.75     |
| 8           | 79       | 81    | 160    | 81.0         | 78.0      |
| 5           | 85       | 76    | 161    | 81.0         | 78.0      |
| 7           | 77       | 90    | 167    | 82.5         | 86.0      |
| 3           | 88       | 82    | 170    | 82.5         | 86.0      |
| 2           | 81       | 96    | 177    | 87.0         | 90.5      |
| 1           | 93       | 85    | 178    | 87.0         | 90.5      |
+-------------+----------+-------+--------+--------------+-----------+

你平时有遇到过用range的场景吗?欢迎留言补充

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据仓库技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验