Учитывая этот набор данных:
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 самых старых человека, но только один из каждого города.
Если бы это были три самые старые, это было бы...
- Генри Джонс/Чикаго
- Мак Тейлор/Нью-Йорк
- Эгон Шпенглер/Нью-Йорк
Однако, поскольку и Эгон Шпенглер, и Мак Тейлор находятся в Нью-Йорке, Эгон Шпенглер выпадет, а следующая (Сара Коннор/Лос-Анджелес) войдет вместо этого.
Любые изящные решения?
Update:
В настоящее время вариант 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 mio строк в моей тестовой среде. У меня есть указатель на "Город, рождение", а второй - на "Рождение".
Примечание. Это связано с...