2
votes

Recherche de la ligne correspondant à la Nième valeur dans chaque groupe par dans SQL

J'ai un tableau A comme suit:

name course_id
Bob    C4
Nick   C7

Je veux une requête qui peut renvoyer le nom de l'élève et le numéro de cours de chaque élève correspondant à la 3e note la plus élevée pour cet élève. Par exemple, dans le tableau ci-dessus, la 3e note la plus élevée pour Bob est 17, donc le numéro de cours est C4. De plus, puisque James a moins de 3 cours, son cours ne doit pas être inclus dans le résultat de la requête. En d'autres termes, le résultat de la requête doit afficher ceci:

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

Quelle serait la requête capable de faire cela?


2 commentaires

Et s'il y a des liens? Votre question n'est pas claire.


@a_horse_with_no_name disons que c'est MySQL


3 Réponses :


0
votes

utiliser la fonction d'analyse de sous-requête et de numéro de ligne corrélée qui prend en charge la plupart des 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


0 commentaires

3
votes

En SQL standard, on ferait cela en utilisant les fonctions de fenêtre:

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

Exemple en ligne: https://rextester.com/YOHZB50840

Exemple en ligne avec MySQL: https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=3f9ff551c89f6941dbf8e424e6dfda56


2 commentaires

Pouvez-vous s'il vous plaît utiliser votre code en utilisant un éditeur SQL en ligne. J'ai essayé d'utiliser ce lien et cela m'a donné une erreur: sqltest.net


@JamesRobisnon: alors apparemment votre SGBD ne supporte pas SQL moderne J'ai ajouté un exemple en ligne



0
votes

Vous pouvez essayer d'utiliser 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 commentaires