首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Postgresql为每个唯一的学生id选择前5行标记

Postgresql为每个唯一的学生id选择前5行标记
EN

Stack Overflow用户
提问于 2018-05-21 13:46:29
回答 1查看 198关注 0票数 1

这是我的一个名为xyz的观点:

代码语言:javascript
运行
复制
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

我以前得到的查询如下所示:

代码语言:javascript
运行
复制
create or replace view xyz as
select * 
from abc 
where id in 
          (select id 
           from data) 
order by id, mark desc, id;

基于唯一的ids,我想要前5行:

代码语言:javascript
运行
复制
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:根据ID选择前5行并查找小计

但我没能做到。你能帮忙吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-21 13:55:23

您可以使用一个rank(),根据每个学生的名字进行分区,并按分数降序排列,以查找每个学生的前5名:

代码语言:javascript
运行
复制
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()这里有更多关于这些的信息
  • 显然,如果一个学生没有5分,那么返回的行就会更少。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50450321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档