Dado este conjunto de datos:MySQL: SELECT N filas, pero con sólo valores únicos en una columna
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 las 3 personas más antiguos, pero sólo uno de cada ciudad.
Si no sería más que los tres mayores, sería ...
- Henry Jones/Chicago
- Mac Taylor/Nueva York
- Egon Spengler/Nueva York
Sin embargo, dado que tanto Egon Spengler como Mac Taylor se encuentran en Nueva York, Egon Spengler se retiraría y el siguiente (Sarah Connor/Los Angeles) entraría en su lugar.
¿Alguna solución elegante?
Actualización:
Actualmente una variación de PConroy es la mejor solución/más rápido:
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 búsqueda original con "IN" es extremadamente lento con grandes conjuntos de datos (abortada después de 5 minutos) , pero mover la subconsulta a un JOIN acelerará mucho. Tomó aproximadamente 0.15 segundos por aprox. 1 mio filas en mi entorno de prueba. Tengo un índice en "Ciudad, año de nacimiento" y un segundo justo en "Año de nacimiento".
Nota: Esto se relaciona con ...
Nota: Este no es el problema real que tengo que resolver, sino un ejemplo. Necesito la solución para dos trabajos diferentes: a) encontrar el artículo con el precio más alto en cada habitación; si hay varios con el mismo precio: obtener el más nuevo. b) obtener 10 trabajos de una cola (ordenados por prioridad), pero solo uno por cliente. – BlaM