我有下表
学生证 | 学生姓名 | 学生.部门名称 | 学生.tot_cred |
---|---|---|---|
128 | ‘张’ | '比较。科学。' | 102 |
12345 | '香卡' | '比较。科学。' | 32 |
19991 | “布兰特” | ‘历史’ | 80 |
23121 | “查韦斯” | “金融” | 110 |
44553 | “珀耳帖” | “物理” | 56 |
45678 | “征费” | “物理” | 46 |
54321 | “威廉姆斯” | '比较。科学。' | 54 |
55739 | “桑切斯” | ‘音乐’ | 38 |
70557 | ‘雪’ | “物理” | 0 |
我想找到就读学生最多的院系 当它起作用时,我想知道两个院系是否有相同数量的学生,我想输出按字母顺序排列较小的院系名称。
我尝试模仿不包含子查询的解决方案: 如何在 sql 中查找最大值及其关联字段值 这正是我所需要的,但包含了计数子查询。
SELECT sub.dept_name, max_dep
FROM (SELECT student.dept_name, COUNT(student.dept_name) as dep_count
FROM student GROUP BY student.dept_name) as sub
WHERE sub.max_dep = (select max(dep_count) from sub )
这会产生语法错误并且不起作用。
chatGPT 也给出了这个代码:
SELECT sub.dept_name, sub.dep_count AS max_dep
FROM (
SELECT student.dept_name, COUNT(student.dept_name) AS dep_count
FROM student
GROUP BY student.dept_name
) AS sub
WHERE sub.dep_count = (SELECT MAX(dep_count) FROM (
SELECT COUNT(student.dept_name) AS dep_count
FROM student
GROUP BY student.dept_name
) AS sub);
这也不起作用。
注意:我正在使用这个网站来检查我的查询(在学生表中)
我也不想使用 ORDER BY 然后限制为 1 行答案,我更喜欢使用
子句来检查最大值,但我不确定如何实现它WHERE
感谢您的帮助!
参见示例
select min(dept_name) dept_name,cnt
from (
select dept_name,count(*) cnt
from student
group by dept_name
having count(*)
=(select max(cnt)
from(
select count(*) cnt
from student group by dept_name
)as counts
)
)max_depts
group by cnt
子查询
counts
结果为(cnt)(3),(1),(1),(1),(3)。counts
中选择max(cnt),结果是(3)。select dept_name,count(*) cnt
from student
group by dept_name
输出是
部门名称 | cnt |
---|---|
比较。科学 | 3 |
金融 | 1 |
历史 | 1 |
音乐 | 1 |
物理 | 3 |
子句
having
过滤此输出(子查询max_depts
)
部门名称 | cnt |
---|---|
比较。科学 | 3 |
物理 | 3 |
子查询
max_depts
可能有 1 行或多行,其中 cnt
是相同的。min(dept_name)
取最小值,并按 cnt
进行分组。select min(dept_name) dept_name,cnt
from ( ... )max_depts
group by cnt