Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在SQL中使用Windows函数,如何找到三门学科平均成绩最高的学生?_Mysql_Sql - Fatal编程技术网

Mysql 在SQL中使用Windows函数,如何找到三门学科平均成绩最高的学生?

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,

我在“学生”表中有这些数据,表中有两列“学生ID”和“分数”


分数是针对数学、英语和科学三门学科的,但在一张表格中以逗号表示。如何使用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