牛客网-SQL入门-33-找出每个学校GPA最低的同学

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 最低的同学的信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值