2009-02-25 12 views
1

私は、関連性のあるマークを持つ生徒のリストを照会するストアドプロシージャを書くのが難しいです。学生一人当たりのトップ5マーク取得些細 - - 学生のリストの取得SQL:ユーザごとのトップNマークの選択(ユーザリスト内)

些細な... SELECT TOPを(5)* StudentID = X

これら二つを組み合わせることで、私は少し混乱しています。

    基準によって
  • セカンドテーブルを学生が一覧表示されます
  • まず表:(最初のテーブルで学生一人当たり各5)等級のリスト
  • は、私は2つのテーブルを返すためにストアドプロシージャをしたいと思います

2番目の表はトリッキーなときです。私はFirst Tableで学生1人あたりすべてのマークを得ることができますが、どのようにしてトップ5に制限できるかはわかりません。

答えて

1

SQL 2005以上を使用している場合は、これが有効です。そうでない場合は、それを行うには少し厄介な方法があります。

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

2つの結果セットを返すストアドプロシージャを避けるようにしてください。これを2つの別々の手順にしてください。

ソート順を指定しない場合、TOP 5はランダムな行を返します。私はあなたがグレード別にソートしたいと思っています。トップグレードがすべて同じ場合は、ソート順の基準を追加する必要があります。たとえば、最新のトップ5の成績を返すことができます。

学生1人当たりのトップ5の成績を返す2番目の手順は、RANK句の構文を調べてください。

+0

複数の結果セットを返さないのはなぜですか? それは、2つの他のストアドプロシージャを呼び出すStored Procのようなものでなければなりません...私はちょうどロジックを理解したいと思っています。:) – TimLeung

+0

A.技術的に可能ですが、これは少し珍しいことです。あなたのコードを見ている人のために理解するのは難しいです。 B.他のデータベース(Orcale)はそれを行うことができないので。 – cdonner

関連する問題