这是我的一个名为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;
基于唯一的ids,我想要前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
我试过这样说:
但我没能做到。你能帮忙吗?
发布于 2018-05-21 13:55:23
您可以使用一个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;
SqlFiddle在这里
备注
rank
将返回所有这样的标记。如果你不想要领带,那就用row_number()
代替rank()
。这里有更多关于这些的信息https://stackoverflow.com/questions/50450321
复制相似问题