这是我的一个名为xyz的观点:
ID | NAME |......Other Data... | Marks
1 A 100
1 A 100
1 A 99
1 A 95
1 A 94
1 A 94
1 A 94
1 A 91
1 A 87
1 A 86
2 B 100
2 B 94
2 B 93
2 B 90
2 B 89
2 B 89
2 B 87
2 B 86
3 C 100
3 C 98
3 C 98
3 C 97
3 C 92
3 C 91
3 C 90
我以前得到的查询是这样的:
create or replace view xyz as
select *
from abc
where id in
(select id
from data)
order by id, mark desc, id;
基于唯一ID,我想要前5行:
ID | NAME |......Other Data... | Marks
1 A 100
1 A 100
1 A 99
1 A 95
1 A 94
2 B 100
2 B 94
2 B 93
2 B 90
2 B 89
3 C 100
3 C 98
3 C 98
3 C 97
3 C 92
我试着提到这个:
MySQL: Select top 5 rows based on ID and find Subtotal
但我无法做到。你能帮忙吗?
答案 0 :(得分:2)
您可以使用按每个学生姓名分区的windowed rank()
,并按标记降序排序,以查找每个学生的前5个分数:
WITH cteRankedMarks AS
(
SELECT "ID", "NAME", "Marks",
rank() OVER (PARTITION BY "NAME"
ORDER BY "Marks" DESC) AS rank
FROM MyTable
)
SELECT "ID", "NAME", "Marks"
FROM cteRankedMarks
WHERE rank <= 5
ORDER BY "NAME", "Marks" DESC;
备注
rank
将返回所有此类标记。如果您不想要联系,请使用row_number()
代替rank()
。 More about these here