2009-02-25 4 views
1

Ich habe Schwierigkeiten beim Schreiben einer Stored Procedure, die eine Liste von Studenten mit ihren assoziativen Marken abfragen wird.SQL: Wählen Sie TOP N Markierungen pro Benutzer (in einer Liste von Benutzern)

eine Liste der Students abrufen - triviale die fünf Noten Suchen pro Schüler - trivial ... SELECT TOP (5) * WHERE StudentID = X

diese beiden kombinierend, ich ein wenig verwirrt bin.

Ich mag die gespeicherte Prozedur zwei Tabellen zurück:

  • erste Tabelle, die Studenten durch ein Kriterium
  • Zweite Tabelle ist: eine Liste der Typen (jeweils 5 pro Schüler in der ersten Tabelle)

Zweite Tabelle ist, wenn es schwierig ist. Ich kann alle Noten pro Schüler in First Table bekommen, aber nicht sicher, wie ich es auf Top 5 begrenzen kann.

Antwort

1

Wenn Sie SQL 2005 oder höher verwenden, sollte dies funktionieren. Wenn nicht, gibt es andere etwas unordentlichere Möglichkeiten, es zu tun.

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

Versuchen Sie, eine gespeicherte Prozedur zu vermeiden, die 2 Ergebnissätze zurückgibt. Mache diese 2 separaten Prozeduren.

TOP 5 gibt zufällige Zeilen zurück, wenn Sie keine Sortierreihenfolge angeben. Ich nehme an, dass Sie nach der Note sortieren möchten. Sie werden einige zusätzliche Sortierreihenfolgekriterien benötigen, wenn die besten Noten alle gleich sind. Sie können zum Beispiel die neuesten Top-5-Noten zurückgeben.

Für Ihr zweites Verfahren, um die besten 5 Noten pro Schüler zurückzugeben, sehen Sie sich die Syntax der RANK-Klausel an.

+0

Warum sollte ich nicht mehr als ein Result Set zurückgeben? Oder sollte es etwas wie ein Stored Proc sein, der zwei andere gespeicherte Procs aufruft ... Ich will nur die Logik verstehen .. :) – TimLeung

+0

A. Weil, während es technisch möglich ist, ist es ein bisschen ungewöhnlich und es macht Es ist schwer für jemanden zu verstehen, der sich Ihren Code ansieht. B. Weil andere Datenbanken (Orcale) es nicht können. – cdonner