【问题标题】:exercise on groups团体运动
【发布时间】:2023-03-21 12:33:01
【问题描述】:

我有以下数据库:

Prof(profBadge, profName, Department) Course(courseCod, courseName, profBadge, area) Class(classCode, date, courseCod, numberOfStudents)

还有以下请求: 对于在地区数据库中只有课程的每位教授,显示徽章编号和平均学生人数最多的课程。

Create view badgeList(profBadge, courseCod) as
SELECT DISTINCT profBadge, courseCod
FROM Coure
WHERE (profBadge NOT IN (SELECT profBadge
                   FROM Course
                   WHERE Area <> 'database'));

Create view avgLessons(AvgStud, courseCod) as
SELECT AVG(numberOfStudents), courseCod
FROM class
GROUP BY courseCod;

Create view MaxStudent(maxStu, profBadge) as
select max(med.avgStud), el.profBadge
from avgLessons med, badgeList el
where med.courseCod= el.courseCod
group by el.profBadge;

select DISTINCT MS.profBadge, MS.MAXSTU, Corso.CODCORSO
from MaxStudent MS, course, class
where MS.profBadge = course.profBadge and MS.maxStu = class.numberOfStudents and course.courseCod = class.courseCod;`

【问题讨论】:

  • 把它分成几部分。首先,您如何找到平均学生人数最多的课程?那么如何将其加入数据集并显示“数据库”课程的徽章和课程编号?
  • 但是如果我找到编号最大的课程,我会丢失其他课程的信息,还是不会?我需要为每位教授找到平均学生人数最多的课程
  • 所以在 profbadge 上的计算中包含一个 group by。并使用徽章和课程重新加入。我试图避免的是为您写答案,而是指导您采取步骤尝试并让您找到解决方案/尝试自己。那位老人教一个人吃一辈子的鱼,给他们一天吃的鱼。不要吃掉整只大象,一次只吃一口,看看它是如何结合在一起的。把复杂的东西分解成组件变得简单,当你把组件放回去时,它就不再复杂了。
  • 我在 xQbert 这边。一步一步地做到这一点。第一步:找到只在地区数据库中开设课程的教授。想办法。遇到问题再回来。
  • 您的最后一个查询无效。您获得了每门课程的平均学生人数,例如12.5,并采取了每位教授的最大值。但这当然不一定与class.numberOfStudents 匹配。你必须加入反对avgLessons 而不是class

标签: sql oracle subquery oracle-sqldeveloper


【解决方案1】:

我不知道我是否看到您想要实现的目标,但下面的代码返回 profBadges 并且只返回那些平均学生人数最多的课程名称(通过所属班级的数量计算)。

SELECT profBadge,
  courseName
FROM
  (SELECT C.profBadge,
    C.courseName,
    SUM(CL.numberOfStudents)                                                      /COUNT(CL.classCode)  AS Avg_Students_Num,
    ROW_NUMBER () OVER (PARTITION BY C.profBadge ORDER BY SUM(CL.numberOfStudents)/COUNT(CL.classCode)) AS Rank
  FROM Course C
  LEFT JOIN Class CL
  ON CL.courseCod=C.courseCod
  GROUP BY C.courseName,
    C.profBadge
  )
WHERE Rank=1

【讨论】:

  • 不只处理具有“数据库”区域的教授。
【解决方案2】:

这不是一件容易的事。如前所述,请逐步执行此操作。

第 1 步:教授只在“数据库”领域开设课程。像您一样使用NOT IN 是解决此问题的一种方法。另一个(通常也是最快的)是聚合。

SELECT profBadge
FROM Course
GROUP BY profBadge
HAVING MIN(Area) = 'database' AND MAX(Area) = 'database';

第 2 步:每门课程的平均学生人数,如您所见。

SELECT courseCod, AVG(numberOfStudents)
FROM class
GROUP BY courseCod;

第 3 步:将两者结合起来。您选择 profBadge 在第一组中的课程(从第 1 步查询),然后按平均学生人数对它们进行排名(您必须加入第 2 步的查询)。

SELECT courseCod, courseName, profBadge, area
FROM
(
  SELECT 
    c.courseCod, c.courseName, c.profBadge, c.area,
    RANK() OVER (PARTION BY c.profBadge ORDER BY av.avgNum DESC) AS rn
  FROM Course c
  JOIN
  (
    SELECT courseCod, AVG(numberOfStudents) AS avgNum
    FROM class
    GROUP BY courseCod
  ) av ON av.courseCod = c.courseCod
  WHERE c.profBadge IN
  (
    SELECT profBadge
    FROM Course
    GROUP BY profBadge
    HAVING MIN(Area) = 'database' AND MAX(Area) = 'database'
  )
)
WHERE rn = 1;

【讨论】:

    猜你喜欢
    • 2013-07-22
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 2020-03-14
    • 2019-11-28
    • 2017-09-30
    相关资源
    最近更新 更多