我有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>
仅供参考:星期五之前无法使用任何解决方案。
答案 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