Mysql 在SQL中使用Windows函数,如何找到三门学科平均成绩最高的学生?
我在“学生”表中有这些数据,表中有两列“学生ID”和“分数”Mysql 在SQL中使用Windows函数,如何找到三门学科平均成绩最高的学生?,mysql,sql,Mysql,Sql,我在“学生”表中有这些数据,表中有两列“学生ID”和“分数” 分数是针对数学、英语和科学三门学科的,但在一张表格中以逗号表示。如何使用windows函数查找所有学生中平均成绩最高的学生?您可以使用union all取消抽取数据。然后,要获得最大的标记,您可以使用订单依据和限制: Student Id | marks 101 | 93,63,74, 102 | 63,66,34, 103 | 93,64,54, 104 | 43,93,34,
分数是针对数学、英语和科学三门学科的,但在一张表格中以逗号表示。如何使用windows函数查找所有学生中平均成绩最高的学生?您可以使用
union all
取消抽取数据。然后,要获得最大的标记
,您可以使用订单依据
和限制
:
Student Id | marks
101 | 93,63,74,
102 | 63,66,34,
103 | 93,64,54,
104 | 43,93,34,
105 | 95,83,54,
您可以使用递归CTE将标记列表拆分为单个标记,然后使用窗口函数获取这些标记的
AVG
,按该值降序,并仅获取第一个结果:
select m.*
from ((select student_id, substring_index(marks, ',', 1) + 0 as mark, 'maths' as subject
from marks
) union all
(select student_id, substring_index(substring_index(marks, ',', 2), ',', -1) + 0 as mark, 'english'
from marks
) union all
(select student_id, substring_index(marks, ',', -1) + 0 as mark, 'science'
from marks
)
) m
order by mark desc
limit 1;
输出:
WITH RECURSIVE CTE AS (
SELECT student_id, SUBSTRING_INDEX(marks, ',', 1) AS mark,
SUBSTRING(marks, LOCATE(',', marks) + 1) AS balance
FROM data
UNION ALL
SELECT student_id, SUBSTRING_INDEX(balance, ',', 1),
SUBSTRING(balance, LOCATE(',', balance) + 1)
FROM CTE
WHERE LOCATE(',', balance) > 0
)
SELECT student_id,
ROUND(AVG(mark) OVER(PARTITION BY student_id), 2) AS avg_mark
FROM CTE
ORDER BY avg_mark DESC
LIMIT 1
正确存储数据!打开时,不要在字符串中存储多个值!你还应该编辑你的问题并显示你想要的结果。哪个版本的MySQL?版本8.0.15。必选结果是数学、英语和科学平均成绩最高的学生的id为什么数据库设计糟糕?我只是想澄清一下,结果必须是在平均3个科目分数后得分最高的学生。您可以使用第二个CTE,例如,如果我删除限制1,我会得到一点特殊的响应。如果删除
限制,您将得到多行。它的存在是为了让你只得到平均值最高的学生id
。我认为你最好使用直接聚合而不是窗口函数:如果不应用限制,我试图看到结果。我不打算无限期地编写最终代码
student_id avg_mark
105 77.33