查询以显示具有最大值 SQL 的所有行
Querying to show all rows with a max value SQL
我正在编写一个查询来计算每位教职工监督的学生人数
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))
但这告诉我我在 it.I 中有一个无效的关系运算符相信 have 子句的第一部分是正确的因为我可以用它来查找特定的行值但不是最大值
您可以使用 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;
此公式假设 first/last 名称对于给定的 F_ID
是唯一的。
另请注意,使用 table 别名时查询更易于编写和阅读。
我正在编写一个查询来计算每位教职工监督的学生人数
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))
但这告诉我我在 it.I 中有一个无效的关系运算符相信 have 子句的第一部分是正确的因为我可以用它来查找特定的行值但不是最大值
您可以使用 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;
此公式假设 first/last 名称对于给定的 F_ID
是唯一的。
另请注意,使用 table 别名时查询更易于编写和阅读。