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?
3 Réponses :
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
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
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
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
Et s'il y a des liens? Votre question n'est pas claire.
@a_horse_with_no_name disons que c'est MySQL