查询以显示具有最大值SQL的所有行

时间:2016-05-22 00:29:23

标签: sql oracle-sqldeveloper

我正在编写一个查询来计算每位员工监督的学生数量

SELECT   FACULTY.F_FIRST || ' ' || F_LAST AS STAFF,(COUNT(FACULTY.F_FIRST || ' ' || F_LAST)) as STUDENTCOUNT
FROM STUDENT

INNER JOIN FACULTY 
ON STUDENT.F_ID=FACULTY.F_ID


GROUP BY FACULTY.F_FIRST,FACULTY.F_LAST
;

正确输出

Teresa Marx 3
Colin Langley   1
Jonnel Brown    1
Mark Zhulin 1

我现在想要修改它,以便查询只显示工作人员监督最多学生的行,包括多名工作人员,例如,如果两名工作人员有3名学生,他们都会显示

我以为我可以通过

的HAVING子句来做到这一点
 HAVING ((COUNT(FACULTY.F_FIRST || ' ' || F_LAST))) 
= MAX(COUNT(FACULTY.F_FIRST || ' ' || F_LAST))

但这告诉我在其中有一个无效的关系运算符。我相信has子句的第一部分是正确的,因为我可以使用它来查找特定的行值而不是最大值

1 个答案:

答案 0 :(得分:0)

您可以使用DENSE_RANK()RANK()执行此操作。这是一个例子:

SELECT (f.F_FIRST || ' ' || f.F_LAST) AS STAFF, CNT as STUDENTCOUNT
FROM FACULTY f INNER JOIN
     (SELECT s.F_ID, COUNT(*) as CNT,
             DENSE_RANK() OVER (ORDER BY COUNT(*) DESC) as seqnum
      FROM STUDENT s
      GROUP BY s.F_ID
     ) s
     ON s.F_ID = f.F_ID
WHERE seqnum = 1;

此公式假定名字的第一个/最后一个名称是唯一的。{/ 1}。

另请注意,使用表别名时查询更容易编写和读取。