【问题标题】:What's wrong with this query using averages?这个查询使用平均值有什么问题?
【发布时间】:2012-07-03 14:40:03
【问题描述】:

课程(cid、cname、描述)

教授(pid,pname)

教学(tid、cid、pid、年份、学期、部门)

学生(sid、lname、fname、b_date、部门)

Enrolled_stud(sid、tid、enrollment_date、grade、grade_date)

问题:查询所有平均分最高的学生姓名:

SELECT a.sname,a.avg
FROM (SELECT s1.sname,avg(e.grade)AS avg
      FROM Students s1
      NATURAL JOIN EnrolledStudents e
      GROUP BY s1.sid
      ) as a
where a.avg=(select max(a.avg))

你可以看到我在SQLFIDDLE 中得到的结果,你可以看到我做错了什么,但我不明白!这一切对我来说似乎都是正确的......

【问题讨论】:

  • 这是免费的斯坦福课程吗?
  • 不,我正在为我的 DBMS 考试学习...
  • 您的预期结果是什么?你期待只有一排吗?我想数据的问题并没有引起我的注意。
  • 它应该输出 Lilach Dba,因为她的 avg 最高
  • 布鲁斯,这可能行得通,但我真的很想了解我提出的查询有什么问题......你有什么想法吗?

标签: mysql sql


【解决方案1】:

既然是学习用的,我先贴出这个提示。想想 where 子句 - a 是当前行。当然a.avg 等于max(a.avg)

更新

尝试以下方法:

SELECT s1.sname, avg(e.grade) AS avg
FROM Students s1
NATURAL JOIN EnrolledStudents e
GROUP BY s1.sid
HAVING avg = (SELECT avg(e.grade) AS avg 
  FROM EnrolledStudents e
  GROUP BY e.sid ORDER BY avg DESC LIMIT 1);

【讨论】:

  • 它不是先运行最大选择吗?并为每个元组使用结果?
【解决方案2】:

好吧,如果没有人有更好看的答案,那么这就是最好的答案:

SELECT s.sname
FROM Students s
NATURAL JOIN EnrolledStudents e
GROUP BY s.sid
HAVING avg(e.grade) >= ALL(SELECT AVG(e.grade)
      FROM  EnrolledStudents e
      GROUP BY e.sid)

【讨论】:

  • 您不需要在内部查询中加入StudentsEnrolledStudents 表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 2011-10-13
  • 1970-01-01
  • 2010-09-07
  • 2010-10-04
相关资源
最近更新 更多