【发布时间】:2011-01-08 22:30:42
【问题描述】:
以下查询:
SELECT
year, id, rate
FROM h
WHERE year BETWEEN 2000 AND 2009
AND id IN (SELECT rid FROM table2)
GROUP BY id, year
ORDER BY id, rate DESC
产量:
year id rate
2006 p01 8
2003 p01 7.4
2008 p01 6.8
2001 p01 5.9
2007 p01 5.3
2009 p01 4.4
2002 p01 3.9
2004 p01 3.5
2005 p01 2.1
2000 p01 0.8
2001 p02 12.5
2004 p02 12.4
2002 p02 12.2
2003 p02 10.3
2000 p02 8.7
2006 p02 4.6
2007 p02 3.3
我想要的只是每个 id 的前 5 个结果:
2006 p01 8
2003 p01 7.4
2008 p01 6.8
2001 p01 5.9
2007 p01 5.3
2001 p02 12.5
2004 p02 12.4
2002 p02 12.2
2003 p02 10.3
2000 p02 8.7
有没有办法在 GROUP BY 中使用某种类似 LIMIT 的修饰符来做到这一点?
【问题讨论】:
-
这在 MySQL 中是可以做到的,但并不像添加
LIMIT子句那么简单。这里有一篇文章详细解释了这个问题:How to select the first/least/max row per group in SQL 这是一篇好文章——他介绍了一个优雅但幼稚的解决方案来解决“Top N per group”问题,然后逐步改进。 -
SELECT * FROM (SELECT year, id, rate FROM h WHERE year BETWEEN 2000 AND 2009 AND id IN (SELECT rid FROM table2) GROUP BY id, year ORDER BY id, rate DESC) LIMIT 5
标签: mysql sql group-by greatest-n-per-group ranking