Redshift 1:1 左连接右表上有重复项

问题描述 投票:0回答:1

我有一个包含学生信息的表(其中每个学生 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 映射,并确保左表仅与右表中的最新条目连接?

sql postgresql amazon-redshift
1个回答
0
投票

首先,使用

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

示范.

© www.soinside.com 2019 - 2024. All rights reserved.