Посмотрите на следующий пример и посмотрите, поможет ли это вам начать. Этот пример можно запустить в SSMS.
-- replicate environment --
DECLARE @TestView TABLE (
SchID INT, StudID INT, TestID INT, LName VARCHAR(30), FName VARCHAR(30), BDate DATETIME, TDate DATETIME, Grade DECIMAL(10,1)
)
INSERT INTO @TestView (
SchID, StudID, TestID, LName, FName, BDate, TDate, Grade
)
VALUES
( 461, 16172, 142773, 'Auk', 'Jay', '2000-06-29', '2010-04-13', 4.7 )
, ( 461, 16172, 136350, 'Auk', 'Jay', '2000-06-29', '2009-04-14', 3.7 )
, ( 146, 5234, 128517, 'Auk', 'Jay', '2000-06-29', '2008-04-01', 2.7 )
, ( 146, 5234, 123560, 'Auk', 'Jay', '2000-06-29', '2007-04-10', 1.7 )
, ( 152, 17899, 123561, 'Gates', 'Bill', '1955-10-28', '2007-04-15', 4.7 )
, ( 152, 17899, 123562, 'Gates', 'Bill', '1955-10-28', '2007-04-14', 3.7 )
, ( 157, 5235, 123563, 'Gates', 'Bill', '1955-10-28', '2007-04-01', 2.7 )
, ( 157, 5235, 123564, 'Gates', 'Bill', '1955-10-28', '2007-04-10', 1.7 );
-- starting data --
SELECT * FROM @TestView;
Возвращает:
+-------+--------+--------+-------+-------+-------------------------+-------------------------+-------+
| SchID | StudID | TestID | LName | FName | BDate | TDate | Grade |
+-------+--------+--------+-------+-------+-------------------------+-------------------------+-------+
| 461 | 16172 | 142773 | Auk | Jay | 2000-06-29 00:00:00.000 | 2010-04-13 00:00:00.000 | 4.7 |
| 461 | 16172 | 136350 | Auk | Jay | 2000-06-29 00:00:00.000 | 2009-04-14 00:00:00.000 | 3.7 |
| 146 | 5234 | 128517 | Auk | Jay | 2000-06-29 00:00:00.000 | 2008-04-01 00:00:00.000 | 2.7 |
| 146 | 5234 | 123560 | Auk | Jay | 2000-06-29 00:00:00.000 | 2007-04-10 00:00:00.000 | 1.7 |
| 152 | 17899 | 123561 | Gates | Bill | 1955-10-28 00:00:00.000 | 2007-04-15 00:00:00.000 | 4.7 |
| 152 | 17899 | 123562 | Gates | Bill | 1955-10-28 00:00:00.000 | 2007-04-14 00:00:00.000 | 3.7 |
| 157 | 5235 | 123563 | Gates | Bill | 1955-10-28 00:00:00.000 | 2007-04-01 00:00:00.000 | 2.7 |
| 157 | 5235 | 123564 | Gates | Bill | 1955-10-28 00:00:00.000 | 2007-04-10 00:00:00.000 | 1.7 |
+-------+--------+--------+-------+-------+-------------------------+-------------------------+-------+
Вы можете увидеть начальные значения выше.
Продолжаем ...
-- update the StudID to the most recent test StudID for student --
UPDATE @TestView
SET
StudID = Tests.MostRecentID
FROM @TestView vwTestList
CROSS APPLY (
SELECT TOP 1 StudID AS MostRecentID FROM @TestView vw
WHERE
vw.LName = vwTestList.LName
AND vw.FName = vwTestList.FName
ORDER BY vw.TDate DESC
) AS Tests;
-- view results --
SELECT * FROM @TestView;
Возвращает:
+-------+--------+--------+-------+-------+-------------------------+-------------------------+-------+
| SchID | StudID | TestID | LName | FName | BDate | TDate | Grade |
+-------+--------+--------+-------+-------+-------------------------+-------------------------+-------+
| 461 | 16172 | 142773 | Auk | Jay | 2000-06-29 00:00:00.000 | 2010-04-13 00:00:00.000 | 4.7 |
| 461 | 16172 | 136350 | Auk | Jay | 2000-06-29 00:00:00.000 | 2009-04-14 00:00:00.000 | 3.7 |
| 146 | 16172 | 128517 | Auk | Jay | 2000-06-29 00:00:00.000 | 2008-04-01 00:00:00.000 | 2.7 |
| 146 | 16172 | 123560 | Auk | Jay | 2000-06-29 00:00:00.000 | 2007-04-10 00:00:00.000 | 1.7 |
| 152 | 17899 | 123561 | Gates | Bill | 1955-10-28 00:00:00.000 | 2007-04-15 00:00:00.000 | 4.7 |
| 152 | 17899 | 123562 | Gates | Bill | 1955-10-28 00:00:00.000 | 2007-04-14 00:00:00.000 | 3.7 |
| 157 | 17899 | 123563 | Gates | Bill | 1955-10-28 00:00:00.000 | 2007-04-01 00:00:00.000 | 2.7 |
| 157 | 17899 | 123564 | Gates | Bill | 1955-10-28 00:00:00.000 | 2007-04-10 00:00:00.000 | 1.7 |
+-------+--------+--------+-------+-------+-------------------------+-------------------------+-------+
StudID был обновлен до последней версии Test StudID для каждой строки. Присоединение к имени заставляет меня нервничать, но если у вас нет другого уникального способа гарантировать студенческий матч (например, два студента имеют одно и то же имя), тогда может быть не так много других вариантов.
Как всегда, проверяйте свои данные перед тем, как запускать обновление, но это должно помочь вам начать работу.