Обновление таблицы с использованием максимальной даты и значений из другой таблицы с использованием sql в ms-access
У меня со следующим сценарием: я хочу обновить tableB
используя рейтинг от tableA
, Проблема в том, что рейтинги меняются случайным образом, и при обновлении записей таблицы B я беру во внимание дату матча, и если рейтинг изменился, скажем, во вторник, а игра была в понедельник раньше, я хочу, чтобы рейтинг был предыдущий рейтинг не самый последний.
#table A: contains rating of players, changes randomly at any date depending
#on drop of form from the players
PID| Rating | DateChange |
1 | 2 | 10-May-2014 |
1 | 4 | 20-May-2015 |
1 | 20 | 1-June-2015 |
2 | 4 | 1-April-2014|
3 | 4 | 5-April-2014|
2 | 3 | 3-May-2015 |
#Table B: contains match sheets. Every player has a different match sheet
#and plays different dates.
MsID | PID | MatchDate | Win | Rating |
1 | 2 | 10-May-2014 | No | 0 |
2 | 1 | 15-May-2015 | Yes | 0 |
3 | 3 | 10-Apr-2014 | No | 0 |
4 | 1 | 21-Apr-2015 | Yes | 0 |
5 | 1 | 3-June-2015 | Yes | 0 |
6 | 2 | 5-May-2015 | No | 0 |
#I am trying to achieve this by running the ms-access query: i want to get
#every players rating at the time the match was played not his current
#rating.
MsID | PID | MatchDate | Rating |
1 | 2 | 10-May-2014 | 4 |
2 | 1 | 15-May-2015 | 2 |
3 | 3 | 10-Apr-2014 | 4 |
4 | 1 | 21-Apr-2015 | 2 |
5 | 1 | 3-June-2015 | 20 |
6 | 2 | 5-May-2015 | 3 |
Я попробовал следующий код:
Update [B-table] as wdev
set wdev.rating = ( SELECT B.MsID, B.PID, B.MatchDate, A.rating as Rating
FROM [B-table] B
INNER JOIN [A-table] A
on B.PID = A.PID
INNER JOIN (
SELECT MAX(Y.DateChange) MDC, Y.PID, Z.Matchdate
FROM [B-table] Z
INNER Join [A-table] Y
on Z.PID = Y.PID
and Y.DateChange <= Z.MatchDate
GROUP BY Y.PID, Z.Matchdate) C
on C.mdc = A.DateChange
and A.PID = C.PId
and B.MatchDate = C.Matchdate) And B.MsID = Wdev.MsID
SQLFiddle со схемой базы данных
В итоге: я хочу, чтобы рейтинг соответствовал максимальному изменению даты на или до даты матча.
1 ответ
Я думаю, что вы просто хотите коррелированный подзапрос:
update [B-table] as b
set rating = (select top 1 rating
from [A-table] as a
where a.pid = b.pid and
a.datechange <= b.matchdate
order by a.datechange desc
) ;
Примечание: из-за того, как MS Access обрабатывает top
, подзапрос может вернуть несколько строк в случае связи. Нормальным решением этого является включение дополнительного значения ключа в order by
, чтобы предотвратить связи. Однако, похоже, что в таблице "а" нет уникального ключа.