# 1. 用窗口函数效率最高,相比于用表连接和where in关联子查询的写法,避免了多次全表扫描;
# 2. 窗口函数的排名方面,row_number()用于排名是不严谨的,遇到最低分相同有两人及以上时,就要出错了;而虽然rank()和dense_rank()都能解决最低排名有两人及以上的问题,但如果遇到需求要取分数倒数第二时,rank因为并列之后会跳过2的编号、直接到3了,所以也不方便取数;而dense_rank()综可以完美解决这个问题。

# 综上,窗口函数 + dense_rank()才是最佳写法。
select
    device_id,
    university,
    gpa
from
    (
        select
            device_id,
            university,
            gpa,
            dense_rank() over (
                partition by
                    university
                order by
                    gpa
            ) as dens_rank
        from
            user_profile
    ) as a
where
    a.dens_rank = 1
order by
    university asc;