# “同校最低GPA只显示最前面一条记录”,应该使用 ROW_NUMBER() 的方法,而不是 FIRST_VALUE()。
# FIRST_VALUE() 是一个窗口函数,它不会减少结果集的行数,而是为每一行返回一个值。具体来说,它的效果是:
# 对于结果集的每一行,FIRST_VALUE() 会返回该行所在分区(由 PARTITION BY 定义)中,按照 ORDER BY 排序后的第一个值。
# 它不会过滤或减少行数,而是为每一行附加一个新列,显示该分区内的第一个值。
# 与 ROW_NUMBER() 的区别:
# FIRST_VALUE() 只返回第一个值,而 ROW_NUMBER() 为每一行分配一个唯一的序号。
# 如果你想只保留第一个记录(即减少行数),应该使用 ROW_NUMBER() 结合 WHERE 子句,而不是 FIRST_VALUE()。
select device_id, university, gpa
from
(
select
device_id,
university,
round(first_value(gpa) over(partition by university order by gpa asc), 1) as gpa,
row_number() over(partition by university order by gpa asc) as rn
from user_profile up
order by university asc
) as sub
where rn = 1;