2017-11-22 10 views
-2

を更新し、私は、以下に示す2つのテーブルがあります。SQL、最新のデータ情報

Table 1 
Student ID - DATE_NO - SCORE 

Table 2 
STUDENT_ID - DATE_NO - HT - WT 

表1、表2に示しながら、物理的なテストの得点と各学生のための試験の日付を持っていますその身長(HT)と体重(WT)と測定された日付。

例データ:

Table 1 
Student ID | DATE_NO | SCORE | 
125  | 3 | 90 | 
572  | 6 | 75 | 
687  | 11 | 95 | 
Table 2 
Student_ID | DATE_NO | HT | WT | 
125  | 2  | 70 | 150 | 
125  | 3  | 72 | 155 | 
125  | 6  | 72 | 160 | 
572  | 2  | 70 | 200 | 
572  | 5  | 70 | 225 | 
572  | 8  | 70 | 215 | 
572  | 9  | 70 | 220 | 
687  | 4  | 65 | 140 | 
687  | 7  | 67 | 150 | 
687  | 11 | 70 | 155 | 
687  | 12 | 67 | 160 | 

Iは、HT/WTとテストスコアの日付の両方でまったく同じDATE_NOを持つことが保証されておりません。私は彼らの身体検査を受けた時、各学生の最新のHTとWTが欲しいです。上記の例のデータに基づいて、最適には参加してくれ、以下の表を与えるだろう:

 
Modified Table 1 
Student ID | DATE_NO | HT | WT | 
125  | 3 | 72 | 155 | 
572  | 6 | 70 | 225 | 
687  | 11 | 70 | 155 | 

私はHT int型とWT int型では、表1を変更した後ので、表1にUPDATEステートメントを使用したいのですが、I次の操作を実行してください:

UPDATE T1 
SET HT = T2.HT, WT = T2.WT 
FROM Table_1 as T1 
INNER JOIN Table_2 AS T2 ON T1.STUDENT_ID = T2.STUDENT_ID 
WHERE (T1.DATE_NO) >= (T2.DATE_NO) 

しかし、結果は私に基準を満たす最初のレコードを与えます。 [> =〜< =]に切り替わります。各学生のHT/WTに、月3,8、および11になるはずの月6,8、および12のエントリを作成します。

FYI:金曜日までに解決策を適用することはできません。

+0

??????構文はdbmsごとに異なります。 SQLは単なる言語にすぎません。 – Eric

+0

SQL Server 2014 Management Studio。私の悪い。 – Brian

+0

あなたは不明な質問をしました。 –

答えて

0

は、それはあなたが探しているようなものです:

UPDATE Q 
SET 
    T1_HT = T2_HT 
    , T1_WT = T2_WT 
FROM 
    (
     SELECT 
      T1.HT T1_HT 
      , T1.WT T1_WT 
      , T2.HT T2_HT 
      , T2.WT T2_WT 
      , ROW_NUMBER() OVER (PARTITION BY T1.STUDENT_ID ORDER BY T2.DATE_NO DESC) R 
     FROM 
      Table_1 T1 
      JOIN Table_2 T2 ON 
       T1.STUDENT_ID = T2.STUDENT_ID 
       AND T2.DATE_NO <= T1.DATE_NO 
    ) Q 
WHERE R = 1 
+0

ありがとうございます!これは、私がやろうとしていることをほぼ解決します。 'updating'テーブルはTEST_SCORESなので、TEST_SCORES.STUDENT_ID = Q.STUDENT_IDで追加すると、それぞれのレコードに正しいHTとWTが追加されました。さもなければ、更新は何らかの理由ですべてのレコードに同じWTを記録しました。 = pお返事ありがとうございます! – Brian

0
SELECT ts.student_id, 
     ts.date_no, 
     hw.ht, 
     hw.wt 
FROM test_scores ts, 
    ht_wt hw 
WHERE hw.student_id = ts.student_id 
    AND hw.date_no <= ts.date_no 
    AND hw.date_no = 
    (SELECT max(date_no) 
    FROM ht_wt 
    WHERE date_no <= ts.date_no 
     AND student_id = ts.student_id) 

DBMSのSQLフィドルhere

+0

あなたのお返事ありがとうございます。これは必要な情報をプルアップしますが、私は更新ステートメントでそれを必要としました。状況が発生した場合でも私はこれを行うことができます。ありがとう! – Brian

関連する問題