# 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;