Name Marks
-------------
John 100
John 80
John 70
John 60
Nancy 95
Nancy 88
Nancy 70
Nancy 40
我有上表。我想获得每位候选人的第三高分。我的输出应该是
Name Marks
-------------
John 70
Nancy 70
一般情况下,我想使查询灵活,以获得每个候选人(不同数据)的第n个最高分。
我知道在mysql中,要获得第n个最高数据,我可以order by desc limit n-1,n
,但我该如何为每个组执行此操作。
答案 0 :(得分:2)
另一个,没有变量,3 in having子句代表第三高分。
SELECT a.name,
a.mark
FROM your_table a left join your_table b on
a.mark<b.mark and a.name=b.name
GROUP BY a.name, a.mark
HAVING (count(b.mark)+1=3)
答案 1 :(得分:1)
尝试
select t1.*
from your_table t1
join
(
select name,
@rank := case when @prevName = name then @rank + 1 else 1 end as rank,
@prevName := name
from your_table
cross join (select @rank := 0, @prevName := '') tmp
group by name
order by name asc, marks desc
) t2 on t1.name = t2.name
where t2.rank = 3