【问题标题】:SQL join match only the largest valueSQL join 只匹配最大值
【发布时间】:2019-07-13 17:41:04
【问题描述】:

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

假设以下场景:

分配

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 是什么? 谢谢。

【问题讨论】:

  • 要格式化为code,选择文本并按ctrl-k或在每行前添加4个空格
  • @JuanCarlosOropeza 感谢您的编辑,但我现在有另一个问题:我不知道如何编写查询:~(
  • @TimBiegeleisen 是的,看起来并不容易
  • dbdummy 你的 MySQL 是什么版本?
  • 我猜你也看到了一个问题,即根据数据,即使是相关的 LIMIT 查询也可能会在同一件事上出现两次。是的...窗口函数在这里肯定会有所帮助。

标签: mysql sql join window-functions


【解决方案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

【讨论】:

  • 谢谢。 dbfiddle 很棒,非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2018-12-14
  • 2012-07-13
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 2017-02-23
相关资源
最近更新 更多