2009-02-25 6 views
1

J'ai de la difficulté à écrire une procédure stockée qui va interroger une liste d'étudiants avec leurs marques associatives.SQL: Sélectionner les marques TOP N par utilisateur (dans une liste d'utilisateurs)

Récupération d'une liste des étudiants - trivial Récupération des cinq meilleures notes par étudiant - trivial ... SELECT TOP (5) * OÙ StudentID = X

La combinaison de ces deux, je suis un peu confus.

Je souhaite que la procédure stockée pour retourner deux tables:

  • Premier tableau répertoriant les étudiants par un critère
  • Deuxième tableau: une liste des grades (5 chacun par élève dans le premier tableau)

La deuxième table est quand c'est difficile. Je peux obtenir toutes les notes par élève dans la première table mais je ne sais pas comment je peux le limiter au top 5.

Répondre

1

Si vous utilisez SQL 2005 ou supérieur, cela devrait fonctionner. Sinon, il existe d'autres façons un peu plus désordonnées de le faire.

WITH Student_Grades AS 
(
    SELECT 
     S.student_id, 
     G.grade, 
     RANK() OVER (PARTITION BY S.student_id, ORDER BY G.exam_date DESC) AS grade_rank 
    FROM 
     Students S 
    LEFT OUTER JOIN Grades G ON 
     G.student_id = S.student_id 
) 
SELECT 
    student_id, 
    grade 
FROM 
    Student_Grades 
WHERE 
    grade_rank <= 5 
1

Essayez d'éviter une procédure stockée qui renvoie 2 ensembles de résultats. Faites ceci 2 procédures séparées.

TOP 5 renvoie des lignes aléatoires si vous ne spécifiez pas d'ordre de tri. Je suppose que vous voulez trier par niveau. Vous aurez besoin de critères de tri supplémentaires dans le cas où les notes supérieures sont les mêmes. Vous pouvez par exemple renvoyer les cinq dernières notes les plus récentes.

Pour votre 2ème procédure pour retourner les 5 premières notes par étudiant, regardez dans la syntaxe de la clause RANK.

+0

Pourquoi ne retournerais-je pas plus d'un jeu de résultats? Ou devrait-il être quelque chose comme un Proc stocké qui appelle deux autres processus stockés ... Je veux juste comprendre la logique .. :) – TimLeung

+0

A. Parce que, si c'est possible sur le plan technique, il est un peu inhabituel et il fait C'est difficile à comprendre pour quelqu'un qui regarde votre code. B. Parce que d'autres bases de données (Orcale) ne peuvent pas le faire. – cdonner

Questions connexes