我有一个包含学生信息的表(其中每个学生 ID 都是唯一的)和一个包含 GPA 的表(代表具有不同时间戳的 GPA,因此学生 ID 不是唯一的)。
学生信息表:
id name major
1 John Smith Math
2 Bob Johnson Science
GPA表:
student_id gpa timestamp
1 4.0 2024-03-22
1 4.1 2024-02-22
1 3.9 2024-01-22
2 3.0 2024-01-22
2 3.2 2023-12-22
我想要一个可以返回学生信息以及他们最近的 GPA 的表格
id name major gpa
1 John Smith Math 4.0
2 Bob Johnson Science 3.0
我尝试使用左连接,但它连接了每个学生条目和每个 gpa 条目,例如
select student.id, student.name, student.major, gpa_table.gpa from students
left join gpa_table on student.id = gpa_table.gpa
返回
id name major gpa
1 John Smith Math 4.0
1 John Smith Math 4.1
我尝试首先使用
select distinct
从 GPA 表中选择不同的学生,但无论如何都会返回重复的行(redshift select different 返回重复值)
有没有办法确保与
left join
进行 1:1 映射,并确保左表仅与右表中的最新条目连接?
row_number
窗口函数对学生的 GPA 进行排序。
select
student_id, gpa,
row_number() over (
partition by student_id
order by gpa_at desc
) as rownum
from gpa
然后我们可以用它左连接,但仅限那些 row_number 为 1 的。
with ordered_gpa as (
select
student_id, gpa,
row_number() over (
partition by student_id
order by gpa_at desc
) as rownum
from gpa
)
select
students.id, students.name, students.major, ordered_gpa.gpa as gpa
from students
left join ordered_gpa on ordered_gpa.student_id = students.id and ordered_gpa.rownum = 1
order by students.id
示范.