SQL查询中连接的所有平均值的最大值

时间:2014-01-10 00:55:58

标签: sql oracle

我有2个表(等级,课程),我需要找到COURSE_ID,其中所有课程等级的最高平均成绩

示例:

DBASE COURSE GRADES : 90,60,90,100 (AVGERAGE=85)
DSTRUCT COURSE GRADES : 100,100,100,100 (AVERAGE=100)
C# COURSE GRADES : 50,50,60,60 (AVERAGE = 55)

所以我应该得到课程的COURSE_ID(DSTRUCT),它是所有平均值的最大平均值

我从这开始就遇到了语法错误!

SELECT COURSE_ID
FROM COURSES
HAVING MAX(SELECT AVG(GRADE) 
FROM COURSES,
WHERE
COURSES.COURSE_ID=GRADES.COURSE_ID);

2 个答案:

答案 0 :(得分:1)

(之前我确实误解了你的问题)

因此,您无法使用order by ... desc,而不能使用with .. as...

我认为你正在做标准的sql,因为你没有提到使用过的sql server。 没有行限制等。

这不是一个很好的解决方案,但它只需要简单的语法using max() and group by即可完成您的工作。

<强> http://sqlfiddle.com/#!2/5ccfc/1

select 
  g.course_id, c.course
from (
  select 
    course_id, 
    avg(grade) as average
  from 
    grades
  group by course_id  
  ) g,
  courses c
where 
g.course_id = c.course_id
and g.average = (
  select 
    max(g1.average) 
  from (
    select 
      course_id, 
      avg(grade) as average
    from 
      grades
    group by course_id  
    ) g1
  )
;

结果

COURSE_ID   COURSE
---------   ------
2           dstruct

<强> SQLFIDDLE * http://sqlfiddle.com/#!2/5ccfc/1 *

答案 1 :(得分:1)

Oracle - SQL Fiddle

SQL Server - SQL Fiddle

查询1

使用命名的子查询(如果有多个课程具有相同的最高平均成绩,那么这将返回所有这些课程):

WITH avg_grades AS (
  SELECT   course_id,
           AVG( grade ) AS avg_grade
  FROM     grades
  GROUP BY course_id 
)
SELECT course_id
FROM   avg_grades
WHERE  avg_grade = ( SELECT MAX( avg_grade ) FROM avg_grades )

<强> Results

| COURSE_ID |
|-----------|
|         2 |

查询2

使用分析功能(如果有多个课程具有相同的最高平均成绩,那么这将仅返回其中一个 - 具有最大course_id的那个):

SELECT MAX( course_id ) KEEP ( DENSE_RANK FIRST ORDER BY avg_grade DESC ) AS course_id
FROM ( SELECT   course_id,
                AVG( grade ) AS avg_grade
       FROM     grades
       GROUP BY course_id )

<强> Results

| COURSE_ID |
|-----------|
|         2 |