2017-02-16 31 views
2

我有一个衡量学生成绩表student在我的数据库如下:如何更新在同一个表基于先前数据的SQL表

ID TestDate PerformanceStatus (PS) 
1 15/03/2016 0 
1 01/04/2016 2 
1 05/05/2016 1 
1 07/06/2016 1 
2 15/03/2016 0 
2 01/04/2016 2 
2 05/05/2016 1 
2 07/06/2016 3 
2 23/08/2016 1 

我想更新我的表有一个新列PreviousPerformanceStatus。 这PreviousPerformanceStatus是基于performanceStatus计算监测,如下: 注:如果没有performanceStatus的TestDate记录之前,我想使PreviousPerformanceStatus = PerformanceStatus

ID TestDate PS PreviousPerformanceStatus 
1 15/03/2016 0 0 
1 01/04/2016 2 0 
1 05/05/2016 1 2 
1 07/06/2016 1 1 
2 15/03/2016 0 0 
2 01/04/2016 2 0 
2 05/05/2016 1 2 
2 07/06/2016 3 1 
2 23/08/2016 1 3 

如何更新我的SQL表?我应该使用连接吗? 谢谢。

+0

逻辑不清晰(或者可能你有一个错字)。你能解释一下规则是什么吗? –

+0

下面是一个提示:首先,编写一个返回结果的查询(一条SELECT语句)。是的,JOIN操作是实现结果的一种方式。或者,您可以使用相关的子查询。一旦你有一个SELECT语句,你可以将它转换成一个UPDATE语句。 – spencer7593

+0

举一个例子,我们使用ID = 1的学生。该previousPerformanceStatus是基于PerformanceStatus从“早期的”测试日期计算,所以当TestDate = 01/04/2016年,我想从TestDate = 15/03/2016使用的数据。但是,如果我找不到任何以前的数据,我将默认PreviousPerformanceStatus与PerformanceStatus –

回答

2

假设testdateDATE数据类型(而不是VARCHAR)

并假设(id,testdate)元组是student

UNIQUE我们可以在SELECT列表中使用相关子查询。举个例子:

SELECT t.id 
     , t.testdate 
     , t.performancestatus 
     , (SELECT p.performancestatus 
      FROM student p 
      WHERE p.id = t.id 
      AND p.testdate < t.testdate 
      ORDER BY p.testdate DESC 
      LIMIT 1 
     ) AS previousperformancestatus 
FROM student t 
ORDER BY t.id, t.testdate 

一旦我们确认SELECT语句给了我们正在寻找的结果,我们可以将它转换为UPDATE语句。既可以作为内联视图,也可以直接使用相关的子查询。

UPDATE student t 
    SET t.previousperformancestatus 
     = (SELECT p.performancestatus 
      FROM student p 
      WHERE p.id = t.id 
      AND p.testdate < t.testdate 
      ORDER BY p.testdate DESC 
      LIMIT 1 
     ) 

如果testdateDATE数据类型,或者是不存储在规范格式,然后再“小于”比较是不能保证限制行的“较早” testdate。并且“order by”不能保证首先返回最近的“更早”的测试日期。

对于“第一” testdate,当没有更早testdate,子查询将返回NULL。我们可以使用表达式为NULL值转换为0。我们可以换子查询的功能,IFNULL(<subquery> ,0)

+0

中的值谢谢 –

相关问题