【发布时间】:2010-09-16 11:36:28
【问题描述】:
给定这个数据集:
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 行。我有一个关于“City, Birthyear”的索引,还有一个关于“Birthyear”的索引。
注意:这与...有关。
【问题讨论】:
-
注意:这不是我要解决的实际问题,而是一个例子。我需要两个不同工作的解决方案:a)在每个房间中找到价格最高的物品 - 如果有几个价格相同:获取最新的。 b) 从队列中获取 10 个作业(按优先级排序),但每个客户只能获取一个。
标签: sql mysql unique aggregate-functions min