SQL33 找出每个学校GPA最低的同学
分析:
每个学校→分组
gpa最低→排名
所以可以利用窗口函数来实现。窗口函数常用于排名、topN、复购问题、累计问题中!
思路1:子查询+窗口函数
SELECT device_id, university, gpa
FROM (
SELECT device_id, university, gpa,
RANK() OVER (PARTITION BY university ORDER BY gpa) AS rnum
FROM user_profile
) AS subquery
WHERE rnum = 1
构建一个含有gpa排名的“子表”,再把排名为1的选出来。
用row_unmber不够严谨,如果出现最低gpa有2个以上的人,这个窗口函数只能取到1个人。所以用rank才是最严谨的,同分数的人排名都一样,都会取到。
思路2:使用表连接
select
u.device_id,
u.university,
u.gpa
from user_profile u
join(
#统计每个学校的最低gpa
select
university,
min(gpa) as gpa
from user_profile
group by university
) as attr
on u.university = attr.university and u.gpa = attr.gpa
order by university
整个 SQL 语句主要由一个主查询(SELECT...FROM...JOIN...
部分)和一个子查询((select university, min(gpa) as gpa from user_profile group by university)
部分)组成。主查询用于获取最终想要展示的列信息,子查询则是辅助主查询,先计算出每个学校的最低 GPA。通过将主查询中的表与子查询的结果进行连接,筛选出每个学校中 GPA 等于该学校最低 GPA 的记录,从而得到每个学校 GPA 最低的同学的信息。