【问题标题】:Returning the Min() of a Count()返回 Count() 的 Min()
【发布时间】:2016-08-26 00:24:37
【问题描述】:

我正在学习SQL测试,前一年有最后一个问题:

说出研究论文数量最少的学生的名字。多少 他们研究过论文吗?

到目前为止,这是我创建的选择查询:

select min(Full_Name), min(Amount) 
from (select st.ST_F_Name & ' ' & st.ST_L_Name as Full_Name, count(*) as Amount
from (student_course as sc
inner join students as st
on st.ST_ID=sc.SC_ST_ID)
group by st.ST_F_Name & ' ' & st.ST_L_Name)

这非常适合返回我想要的结果,但我不确定这是否是我应该执行此查询的方式?我觉得在 Full_Name 上调用 min() 在某些情况下可能会适得其反。有没有更好的方法来做到这一点? (这是在 MS Access 中,原因不明)

【问题讨论】:

  • 之所以这样做是因为在这种情况下只有一个学生可以返回。但是,如果我有多个学生的论文数量最少怎么办?据我所知,这只会返回一个学生,而不是其他学生。如果有多个,我怎么写它会返回所有这些?
  • 有两种可能:1. 在不存在的地方使用阅读论文数较高的学生,2. 找到最小值并再次将表与计数连接起来以获取具有该数的学生姓名数数。没有with,这两个查询写起来都很烦人。
  • 顺便说一句,问题本身存在不一致:“学生”和“有”是单数,但“有”和“他们”是复数。 (我们想使用with,因为这两种方法都引用了带有计数的中间表两次,所以我们不必写两次。)

标签: sql ms-access count min


【解决方案1】:

如果有多个这样的学生,你只想要其中一个,这可能是最简单的:

select st.ST_F_Name, st.ST_L_Name, count(*) as Amount
from student_course as sc
inner join students as st
on st.ST_ID=sc.SC_ST_ID
group by st.ST_ID
order by Amount ASC LIMIT 1

但是,如果您想找到 所有 stuch 学生,则采用不同的方法。我们使用 WITH 子句来简化事情,它定义了一个 CTE(通用表表达式)计算每个学生的课程数量。然后我们选择人数等于该 CTE 中最小值的学生:

with per_student as (
select st.ST_F_Name, st.ST_L_Name, count(*) as Amount
from student_course as sc
inner join students as st
on st.ST_ID=sc.SC_ST_ID
group by st.ST_ID
)
select * from per_student 
where amount = (select min(amount) from per_student)

但这个问题的真正诀窍在于,可能有学生没有参加任何课程。但是,到目前为止,您将永远看不到它们。你想要这样的东西:

with per_student as (
select st.ST_F_Name, st.ST_L_Name, count(sc.SC_ST_ID) as Amount
from student_course as sc
right outer join students as st
on st.ST_ID=sc.SC_ST_ID
group by st.ST_ID
)
select * from per_student 
where amount = (select min(amount) from per_student)

【讨论】:

  • 我不得不稍微改变它以使其与 MS Access 一起使用,但谢谢。 With 子句在 Access 中的工作方式似乎不同。
  • @Syzorr 是的,这是我没有将 cmets 作为答案的原因......与查询。
【解决方案2】:

您可以通过count(*) 订购,以获得论文数量最少的学生:

select * from students where st_id in (
    select top 1 sc_st_id 
    from student_course 
    group by sc_st_id
    order by count(*)
)

如果您还需要研究的论文数,则加入包含最小计数的派生表:

select * from students s
left join (
    select top 1 sc_st_id, count(*)
    from student_course 
    group by sc_st_id
    order by count(*)
) t on t.sc_st_id = s.st_id

【讨论】:

  • 如果有多个论文最少的学生,此代码仍然只会给 1 个学生。
猜你喜欢
  • 1970-01-01
  • 2017-07-29
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 2020-12-22
  • 1970-01-01
相关资源
最近更新 更多