显示SQL中学生数最少的部门的名称

时间:2017-06-27 08:58:39

标签: sql oracle

表格

Department (dept_id,dept_name)
Students(student_id,student_name,dept_id)

我正在使用Oracle。我必须打印那个具有最小数量的部门的名称。学生的。由于我是SQL新手,因此我遇到了这个问题。到目前为止,我已经这样做了:

select d.department_id,d.department_name,
from Department d
join Student s on s.department_id=d.department_id
where rownum between 1 and 3
group by d.department_id,d.department_name
order by count(s.student_id) asc;

输出不正确。它将以IT,SE,CSE出现,而输出应为IT,CSE,SE!我的查询是对的吗?或者我的查询中缺少什么?

我做错了什么?

2 个答案:

答案 0 :(得分:0)

其中一种可能性:

select dept_id, dept_name 
  from (
    select dept_id, dept_name, 
           rank() over (order by cnt nulls first) rn
      from department
      left join (select dept_id, count(1) cnt 
                   from students 
                   group by dept_id) using (dept_id) )
  where rn = 1

首先从表格students分组数据,加入表格department,排名数字,取第一行。

left join用于保证我们将检查没有学生的部门。 如果有两个或更多部门的学生人数最少,则使用rank()

答案 1 :(得分:0)

要找到学生人数最少的部门,您必须按部门ID计算,然后取最少数量的ID。

从Oracle 12c开始,这只是:

select department_id
from student
group by department_id
order by count(*)
fetch first row with ties

然后,您可以在找到的集合中选择具有ID的部门。

select * from department where id in (<above query>);

在旧版本中,您可以使用RANK来按部门对部门进行排名:

select department_id, rank() over (order by count(*)) as rnk
from student
group by department_id

rnk = 1行是具有最低计数的部门ID。所以你可以选择部门:

select * from department where (id, 1) in (<above query>);