SQL连接仅匹配最大值

时间:2019-02-20 05:35:21

标签: mysql sql join window-functions

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

采取以下情形:

分配

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上,没有提供反馈。

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

输出应为(分配表中的每一行一行)

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

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

要实现此目标的MYSQL是什么? 谢谢。

1 个答案:

答案 0 :(得分:1)

据我了解,您需要在提交作业后的第一时间反馈。

您可以尝试以下查询吗?

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链接- https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=1eac67b052e435e055608e95668a436f