SQL,使用最新数据信息进行更新

时间:2017-11-22 23:53:13

标签: sql sql-server sql-server-2014

我有2个表格如下所示:

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  |

我无法保证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 |

我想在表1中使用UPDATE语句,因此在使用HT int和WT int更改表1后,我尝试执行以下操作:

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)

但结果给了我符合标准的FIRST记录。切换大于小于[&gt; =至&lt; =]使每个学生的HT / WT为第6,8和12个月的条目,当它应该是第3,8和第11个月时。任何建议?< / p>

仅供参考:星期五之前无法使用任何解决方案。

2 个答案:

答案 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

答案 1 :(得分: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)

sql fiddle here