SQL-соединение соответствует только наибольшему значению - PullRequest
0 голосов
/ 20 февраля 2019

Сценарий таков: у нас есть задания и отзывы, которые дает студент после задания.Они не связаны в базе данных (кроме курса и студента).Есть несколько магазинов каждого.Студент может быть повторно проверен в задании и может дать обратную связь несколько раз.

Примите следующий сценарий:

НАЗНАЧЕНИЕ

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

Студент сидел в задании А1 в 06:00 и предоставил свои отзывы в 07:00.(Отзыв 1).Они изменили свое мнение и обновили свои отзывы в 1200 (отзыв 2).Затем они были повторно протестированы в задании А1 в 18:00 и предоставили свои отзывы для повторного тестирования в 19:00 (обратная связь 3).Отдельно они сидели А2 и не обеспечивали обратную связь.

Нам нужно сопоставить обратную связь с назначением, основанным на времени.

Вывод должен быть (одна строка на строку из таблицы назначений)

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 голосов
/ 20 февраля 2019

Насколько я понимаю, вам нужно первое время обратной связи после подачи задания.

Можете ли вы попробовать следующий запрос -

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

...