Обновление таблицы с использованием максимальной даты и значений из другой таблицы с использованием 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, чтобы предотвратить связи. Однако, похоже, что в таблице "а" нет уникального ключа.

Другие вопросы по тегам