2017-02-16 12 views
2

私は以下のように生徒のパフォーマンスを測定テーブルstudent私のDB内を持っている:私は持っている私のテーブルを更新したいは、どのように、同じテーブルに以前のデータに基づいて、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に基づいて計算されては以下のように、監視対象TestDate前に記録performanceStatusがない場合、私は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文)を記述します。そして、はい、ジョイン操作は、結果を達成するための1つの方法です。また、相関サブクエリを使用することもできます。いったんSELECTステートメントがあれば、それをUPDATEステートメントに変換することができます。 – spencer7593

+0

例としてID = 1のstudentを使ってみましょう。 previousPerformanceStatusは、 "以前の"テスト日付のPerformanceStatusに基づいて計算されます。したがって、TestDate = 01/04/2016の場合、TestDate = 15/03/2016のデータを使用します。ただし、以前のデータが見つからない場合は、PerformanceStatus –

答えて

2

testdateDATE列はデータ型(およびVARCHARではない)であると仮定すると

、我々はSELECTリストに相関サブクエリを使用することができ(id,testdate)タプルstudent

内で一意であると仮定。例として、

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 
     ) 
testdate

ないDATEデータ型であるか、または正規の形式で格納されていない場合、次いで比較「未満」は、「以前」testdateに行を制限することが保証されません。また、「注文」は、最新の「以前の」テスト日を最初に返すことは保証されていません。

"最初の"テスト日の場合、前のテスト日がない場合、サブクエリはNULLを返します。式を使用してNULL値を0に変換することができます。サブクエリを関数にラップすることができます。IFNULL(<subquery> ,0)

+0

の値を使用してPreviousPerformanceStatusをデフォルト設定します –

関連する問題