このデータセットを考えると:
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 人の最年長者を見つける必要がありますが、すべての都市で 1 人だけです。
最年長の3人だけなら…
- ヘンリー・ジョーンズ / シカゴ
- マック・テイラー / ニューヨーク
- エゴン・スペングラー / ニューヨーク
しかし、Egon Spengler と Mac Taylor はどちらもニューヨークにいるため、Egon Spengler はドロップアウトし、代わりに次のメンバー (Sarah Connor / Los Angeles) が入ってきます。
エレガントなソリューションはありますか?
アップデート:
現在、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秒かかりました。テスト環境で 100 万行。「都市、誕生年」のインデックスと、「誕生年」だけのインデックスがあります。
注:これは関連しています...