Étant donné cet ensemble de données :
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
Je dois trouver les 3 personnes les plus âgées, mais seulement une de chaque ville.
Si c'était juste les trois plus vieux, ce serait...
- Henry Jones / Chicago
- Mac Taylor / New York
- Egon Spengler / New York
Cependant, comme Egon Spengler et Mac Taylor sont tous deux situés à New York, Egon Spengler serait éliminé et le suivant (Sarah Connor / Los Angeles) entrerait en scène à sa place.
Des solutions élégantes ?
Mise à jour :
Actuellement, une variation de PConroy est la solution la meilleure/la plus rapide :
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;
Sa requête originale avec "IN" est extrêmement lente avec de grands ensembles de données (elle est abandonnée après 5 minutes), mais le fait de déplacer la sous-requête vers un JOIN l'accélère considérablement. Il a fallu environ 0,15 seconde pour environ 1 million de lignes dans mon environnement de test. J'ai un index sur "Ville, année de naissance" et un deuxième index sur "Année de naissance".
Note : Ceci est lié à...