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

时间:2018-05-21 13:46:30

标签: database postgresql

这是我的一个名为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

但我无法做到。你能帮忙吗?

1 个答案:

答案 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;

SqlFiddle here

备注

  • 如果两个或多个标记具有相同的价值争夺第五名,则rank将返回所有此类标记。如果您不想要联系,请使用row_number()代替rank()More about these here
  • 显然,如果学生没有5分,那么将会返回更少的行。