2013-06-28 172 views
0

我有一个简单模式的表格:user_id,score我想提取最高分数的n条记录,这样每个user_id只表示一次。从表格中选择最多n条记录,每组最多一条记录

这个问题类似于Get top n records for each group of grouped results,不同之处在于,不需要每个组需要n个代表,我需要n个表的代表,每个组最多有一个记录。

因此,如果我在找N = 3,运行查询:

user_id | score 
     1 | 10 
     2 |  9 
     1 | 11 
     2 |  8 
     3 |  8 
     4 | 12 

应该产生:

user_id | score 
     4 |  12 
     1 |  11 
     2 |  9 

回答

2
SELECT user_id, MAX(score) FROM table GROUP BY user_id ORDER BY MAX(score) DESC LIMIT 3; 
+0

哇哦,我是gymnasting通过自我加入和子查询和所有的东西,很高兴它有一个简单的解决方案! – Mala

+1

@Mala:那么你还在想'RBAR - 通过Agonizing Row排。相反,学会“逐列”思考;在这种情况下,前3名用户的最高分数很快会导致此解决方案。 –

+0

如果我在表中添加了一个日期列,我怎么能扩展它以返回正确的日期?选择日期的微小扩展也会返回第一个日期,而不是与最高分数相关的日期 – Mala