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