Нахождение строки, соответствующей N-му значению в каждой группе, в SQL - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть таблица A следующим образом:

name   course  grade
Bob      C1     12
Bob      C2     13
Bob      C3     23
Bob      C4     17 
James    C2     15
James    C6     27
Nick     C5    18
Nick     C1    16
Nick     C3    22
Nick     C2    32
Nick     C7    19

Я хочу запрос, который может вернуть имя студента и номер курса для каждого студента, соответствующего 3-му старшему классу для этого студента.Например, в таблице выше 3-й самый высокий балл для Боба - 17, поэтому номер курса - C4.Кроме того, поскольку у Джеймса менее 3 курсов, его курс не следует включать в результат запроса.Другими словами, результат запроса должен показать это:

name course_id
Bob    C4
Nick   C7

Какой запрос может это сделать?

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

В стандартном SQL это можно сделать с помощью оконных функций:

select name, course
from (
   select name, course, grade, 
          dense_rank() over (partition by name order by grade) as rnk
   from grades
) t
where rnk = 3

Онлайн пример: https://rextester.com/YOHZB50840

Онлайн пример с MySQL: https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=3f9ff551c89f6941dbf8e424e6dfda56

0 голосов
/ 12 февраля 2019

Вы можете попробовать использовать row_number()

    select name, course
    from (
       select name, course, grade, 
              row_number() over (partition by name order by grade desc) as rn
       from grades
    ) t where rn = 3
0 голосов
/ 12 февраля 2019

использовать аналитичную функцию подзапроса и row_number, которые поддерживают большинство dbms

with cte as 
  ( select t1.* from table t1 where 
           exists ( select 1 from table t2 where t1.name=t2.name
                                 group by name 
                                 having count(distinct course)>=3
                  )
  ) , 
 cte2 as 
  (
select * ,row_number() over(partition by name order by grade asc) rn 
from cte
  ) select * from cte2 where rn=3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...