场景是我们有作业和作业后学生给出的反馈。它们在数据库中不相关(课程和学生除外)。每个都有多个。可以在作业中对学生进行重新测试,并且可以多次给出反馈。
采取以下情形:
分配
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是什么? 谢谢。
答案 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