0

次の3つのテーブルがあります。

student
-------
stnumb
stname
gender
grade
born

subject
-------
subjnumb
subjname
tname

results
-------
stnumb
subjnumb
percent

私は返す必要がありますhighest result and its subject for each student

Bob Smith、IPT、92

私が得た2つの最も近い結果は次のとおりです。

SELECT  stname
    ,   subjname
    ,   highestmark
FROM    (
            SELECT      MAX(results.percent) as "highestmark"
                    ,   student.stname
                    ,   subject.subjname
            FROM        student
                    ,   subject
                    ,   results
            WHERE       results.stnumb      = student.stnumb
            AND         results.subjnumb    = subject.subjnumb
            GROUP BY    stname
        ) maxresult

...と...

SELECT      student.stname as Student
        ,   subject.subjname as Subject
        ,   results.percent as Mark
FROM        results 
JOIN        student
ON          results.stnumb = student.stnumb
JOIN        subject
ON          results.subjnumb = subject.subjnumb
ORDER BY    stname

誰かが私を正しい方向に向けてくれませんか?私は何日もそれに取り組んできましたが、何の根拠もありません。

4

2 に答える 2

0
SELECT pct, subjname, stname 
FROM
(SELECT r.pct, sub.subjname, std.stname,
RANK () OVER (PARTITION BY sub.subjname ORDER BY r.pct) as rk
FROM student std 
INNER JOIN results r ON r.stnumb = std.stnumb 
INNER JOIN subject sub ON sub.subjnumb = r.subjnumb 
GROUP BY sub.subjname, std.stname, r.pct ) a
WHERE rk = 1
于 2012-05-02T23:53:44.067 に答える
0

GROUP BYにsubjnameがないことから判断すると、これはMySqlです。MySqlには分析関数がないため、上位1の古い形式を呼び出す必要があります。最大値を保持する派生テーブルを持つバージョンがあります。このテーブルは、元のテーブルをフィルタリングするために使用されます。

SELECT      student.stname as Student
        ,   subject.subjname as Subject
        ,   results.percent as Mark
FROM        results 
JOIN        student
ON          results.stnumb = student.stnumb
JOIN        subject
ON          results.subjnumb = subject.subjnumb
JOIN
(
   SELECT stnumb, MAX(percent) percent
     FROM results
    GROUP BY stnumb
) top1GradePerStudent
  ON results.stnumb = top1GradePerStudent.stnumb
 AND results.percent = top1GradePerStudent.percent
ORDER BY    stname

not existsパーセントが高くない学生レコードのみを取得するアプローチもあります。

SELECT      student.stname as Student
        ,   subject.subjname as Subject
        ,   results.percent as Mark
FROM        results 
JOIN        student
ON          results.stnumb = student.stnumb
JOIN        subject
ON          results.subjnumb = subject.subjnumb
WHERE       NOT EXISTS 
            (
                SELECT null
                  FROM results r2
                 WHERE r2.stnumb = results.stnumb
                   AND r2.percent > results.percent
            )
ORDER BY    stname

どちらの方法でも関係が返されます。学生ごとに1つのレコードが必要な場合はsubjname、MAXまたはMINで囲みます。行の他のすべてのデータは同じであるため、どの科目を選択してもかまいません。

PS私はこのクエリをテストしませんでした。タイプミスがあるかもしれませんが、基本的なアプローチは正しいです。

于 2012-05-03T07:53:32.757 に答える