MySQL: seleccione N filas, pero con solo valores únicos en una columna
Dado este conjunto de datos:
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
Necesito encontrar a las 3 personas más viejas, pero solo a una de cada ciudad.
Si solo fueran los tres más antiguos, sería ...
Henry Jones / ChicagoMac Taylor / Nueva YorkEgon Spengler / Nueva YorkSin embargo, dado que tanto Egon Spengler como Mac Taylor están ubicados en Nueva York, Egon Spengler se retiraría y la siguiente (Sarah Connor / Los Angeles) entraría.
¿Alguna solución elegante?
Actualizar:
Actualmente una variación de PConroy es la mejor / la solución más rápida:
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;
Su consulta original con "IN" es extremadamente lenta con grandes conjuntos de datos (se abortan después de 5 minutos), pero mover la subconsulta a una ÚNETE lo acelerará mucho. Tomó unos 0,15 segundos durante aprox. 1 mio filas en mi entorno de prueba. Tengo un índice en "City, Birthyear" y un segundo solo en "Birthyear".
Nota: Esto está relacionado con ...
Seleccionando filas únicas en un conjunto de dos posibilidadesConsulta SQL para obtener el último precio.