【场景】:每个--最低(高)-- 【分类】:窗口函数、分组函数、表连接

分析思路

难点: 1.如何取出使用分组函数之后得不到的device_id?连接其他表或者使用排序函数

(1)统计每个学校的最低gpa

  • [使用]:min

(2)取出每个学校gpa最低的同学的device_id

  • [使用]:join

最终结果

select 查询结果 [用户号;学校;gpa]
from 从哪张表中查询数据[多表]
order by 对查询结果排序 [学校];

求解代码

方法一:

with子句 + 一步步拆解

with
    temp as(
        #对每个学校的gpa排序
        select distinct
            device_id,
            university,
            row_number() over(partition by university order by gpa) as ranking,
            min(gpa) over(partition by university order by gpa) as gpa
        from user_profile
        order by university
    )
#取出每个学校gpa最低的同学的device_id
select 
    device_id,
    university,
    gpa
from temp
where ranking = 1

方法二:

表连接

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

方法三:

子查询

select
    device_id,
    university,
    gpa
from user_profile
where (university,gpa) in(
    #统计每个学校的最低gpa
    select
        university,
        min(gpa) as gpa
    from user_profile
    group by university
)
order by university