给定这个数据集:
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 个最年长的人,但每个城市只有一个。
如果它只是三个最古老的,那将是......
- 亨利琼斯 / 芝加哥
- 麦克泰勒/纽约
- 埃贡斯宾格勒 / 纽约
然而,由于 Egon Spengler 和 Mac Taylor 都位于纽约,因此 Egon Spengler 将退出,而下一位(Sarah Connor / 洛杉矶)将进入。
任何优雅的解决方案?
更新:
目前,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 行。我有一个关于“城市,生日”的索引,而第二个索引是关于“生日”的。
注意:这与...有关