Postgresql выбирает 5 лучших строк для каждого уникального студенческого идентификатора - PullRequest
0 голосов
/ 21 мая 2018

Это одно из моих представлений под названием 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;

И на основе уникальных идентификаторов я хочуверхние 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: выберите первые 5 строк на основе идентификатора и найдите промежуточный итог

НоЯ не смог этого сделать.Не могли бы вы помочь?

1 Ответ

0 голосов
/ 21 мая 2018

Вы можете использовать оконное 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 здесь

Примечания

  • Если две или более меток имеют одинаковое значение, соперничающее за 5-е место, то rank будетвернуть все такие отметки.Если вы не хотите галстуков, используйте row_number() вместо rank(). Подробнее об этом здесь
  • Очевидно, что если у ученика нет 5 оценок, будет возвращено меньше строк.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...