SQL join 只匹配最大值

SQL join match only the largest value

场景是我们有作业和作业后学生给出的反馈。它们在数据库中不相关(课程和学生除外)。每个都有倍数。学生可以在作业中重新测试,并可以多次提供反馈。

采用以下场景:

作业

Name    time (these are really Unixtimestamps)
A1  0600
A1  1800
A2  0700

反馈

Assignment  time    key
A1      0700    feedback 1
A1      1200    feedback 2
A1      1900    feedback 3

学生在 0600 完成了作业 A1,并在 0700 提供了反馈(反馈 1)。他们改变了主意并在 1200 处更新了他们的反馈(反馈 2)。然后他们在 1800 时在作业 A1 中重新测试,并在 1900 时向重新测试提供反馈(反馈 3)。他们单独坐在 A2 上,没有提供反馈。

我们需要根据时间将反馈与作业相匹配。

输出应该是(赋值 table 每行一行)

Assignment  assignmenttime  feedbacktime    Feedback
A1          0600            0700            feedback 1
A1          1800            1900            feedback 3
A2          0700            NULL            NULL

反馈 1 与 A1 相关,因为我可以加入名称并且 feedback.time 大于 assignment.time。我的问题是,如果有多个反馈记录,我只想要比分配时间大的最小的一个。 如果没有匹配作业/时间的反馈记录,那么我们仍然需要作业记录。

MYSQL 是什么让这一切发生? 谢谢

据我了解,您需要在提交作业后进行第一次反馈。

你能试试下面的查询吗 -

SELECT NAME, 
       assginment_time, 
       feedback_time, 
       col3 
FROM   (SELECT t1.NAME, 
               t1.time1               AS assginment_time, 
               t2.time1               AS feedback_time, 
               t2.col3, 
               row_number() 
                 OVER ( 
                   partition BY t1.NAME, t1.time1 
                   ORDER BY t2.time1) AS rnk 
        FROM   (SELECT NAME, 
                       time1, 
                       COALESCE(lead(time1) 
                                  OVER ( 
                                    partition BY NAME 
                                    ORDER BY time1), 9999) next_time 
                FROM   assignments) t1 
               LEFT OUTER JOIN feedback t2 
                            ON t1.NAME = t2.col1 
                               AND t2.time1 BETWEEN t1.time1 AND t1.next_time) A 
WHERE  A.rnk = 1; 

更改了列名,请参考dbfiddle link - https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=1eac67b052e435e055608e95668a436f