MySQL: выберите N строк, но только с уникальными значениями в одном столбце
Учитывая этот набор данных:
ID Name City Birthyear
1 Egon Spengler New York 1957
2 Mac Taylor New York 1955
3 Sarah Connor Los Angeles 1959
4 Jean-Luc Picard La Barre 2305
5 Ellen Ripley Nostromo 2092
6 James T. Kirk Riverside 2233
7 Henry Jones Chicago 1899
Мне нужно найти 3 самых старых людей, но только по одному в каждом городе.
Если бы это были только три самых старых, это было бы ...
Генри Джонс / ЧикагоМак Тейлор / Нью-ЙоркЭгон Шпенглер / Нью-ЙоркОднако, поскольку Egon Spengler и Mac Taylor находятся в Нью-Йорке, Egon Spengler выбывает, а вместо этого приходит следующий (Сара Коннор / Лос-Анджелес).
Какие-нибудь элегантные решения?
Обновить:
В настоящее время вариант PConroy является лучшим / самым быстрым решением:
SELECT P.*, COUNT(*) AS ct
FROM people P
JOIN (SELECT MIN(Birthyear) AS Birthyear
FROM people
GROUP by City) P2 ON P2.Birthyear = P.Birthyear
GROUP BY P.City
ORDER BY P.Birthyear ASC
LIMIT 10;
Его оригинальный запрос с «IN» очень медленный с большими наборами данных (прерванный через 5 минут), но перемещение подзапроса в JOIN значительно ускорит его. Это заняло около 0,15 секунд в течение ок. 1 млн строк в моей тестовой среде. У меня есть индекс "Город, Год рождения", а второй только "Год рождения".
Примечание: это связано с ...
Выбор уникальных строк в наборе из двух возможностейSQL-запрос, чтобы получить последнюю цену