У меня есть база данных MS Access, которая содержит таблицу дат, оценок и людей, к которым относятся эти оценки, например,
Date Score Name
1/6/11 5 Dave
1/6/11 10 Sarah
2/6/11 4 Dave
2/6/11 3 Graham
3/6/11 1 Dan
4/6/11 11 Dan
4/6/11 9 Graham
Я хотел бы написать запрос, чтобы определить, кто получил наивысший сокр за каждую дату, то есть результат:
Date Score Name
1/6/11 10 Sarah
2/6/11 4 Dave
3/6/11 1 Dan
4/6/11 11 Dan
Я могу придумать два решения этой проблемы (я открыт для альтернативных предложений):
1) Напишите запрос, чтобы найти минимальную оценку для каждой даты, затем второй запрос, соединяющий первый запрос с исходной таблицей. i.e.:
Query1:
SELECT Date, MAX(Score) AS MaxScore FROM ScoresTable GROUP BY Date
Query2:
SELECT ScoresTable.*
FROM ScoresTable INNER JOIN Query1
ON ScoresTable.Date = Query1.Date
AND ScoresTable.Score = Query1.MaxScore
[Они могут быть объединены в один запрос:
SELECT ScoresTable.*
FROM ScoresTable INNER JOIN
(SELECT Date, MAX(Score) AS MaxScore
FROM ScoresTable GROUP BY Date) Query1
ON ScoresTable.Date = Query1.Date
AND ScoresTable.Score = Query1.MaxScore
но я предпочитаю держать их отдельно, чтобы другим было легче им следовать, т. Е. Они могут использовать интерфейс Access, не зная SQL]
2) Написать один запрос с другим простым запросом в предложении WHERE (это новый метод, о котором я только что прочитал, у него есть имя?), Т. Е .:
SELECT * FROM ScoresTable WHERE Score =
(SELECT MAX(Score) FROM ScoresTable AS st WHERE st.Date = ScoresTable.Date)
Последний явно более элегантный, но, кажется, работает медленнее. Какой вариант лучше? Наборы данных могут быть довольно большими.