0

次のような試験結果の表があります。

CREATE TABLE tbl (
studentid INT,
examid INT,
score INT,
attempt INT,
percentcorrect INT
);

ここで、すべての学生について、彼の最高の試験結果 (正解率で測定) を抽出する必要があります。特定の試験が 2 回達成され、特定の学生が同じ最高得点を記録した場合は、最新の試行の記録を表示する必要があります。私は二重にネストされたクエリでそれを行いました(最初に最高のパーセント正解を選択し、次に結果セットから最大試行を選択し、次に残りのデータを選択します)が、これを達成するためのより効率的な方法があることを願っています. 何か案は?

編集:私のクエリ:

SELECT 
    result.score
    , r2.attempt
    , r2.percentcorrect
    , r2.studentid
    , r2.examid
FROM
    tbl result JOIN
    (
        SELECT
            res.studentid
            , res.examid
            , r.percentcorrect
            , MAX(res.attempt) AS attempt
        FROM 
            tbl res JOIN
            (
                SELECT studentid, examid, MAX(percentcorrect) AS percentcorrect
                FROM tbl
                GROUP BY studentid, examid
            ) r ON r.studentid = res.studentid 
            AND r.examid = res.examid
            AND r.percentcorrect = res.percentcorrect
        GROUP BY
            res.studentid
            , res.examid
            , r.percentcorrect
        ORDER BY res.examid
      ) r2
ON r2.studentid = result.studentid
AND r2.examid = result.examid
AND r2.percentcorrect = result.percentcorrect
AND r2.attempt = result.attempt

いくつかのサンプルデータ:

INSERT ALL 
INTO tbl(studentid, examid, percentcorrect, attempt, score)
VALUES(1,1,30,1,10)
INTO tbl(studentid, examid, percentcorrect, attempt, score)
VALUES(1,1,20,2,15)
INTO tbl(studentid, examid, percentcorrect, attempt, score)
VALUES(2,1,80,1,100)
INTO tbl(studentid, examid, percentcorrect, attempt, score)
VALUES(2,1,80,2,90)
INTO tbl(studentid, examid, percentcorrect, attempt, score)
VALUES(3,2,10,1,9)
INTO tbl(studentid, examid, percentcorrect, attempt, score)
VALUES(3,3,15,1,100)
SELECT * FROM DUAL; COMMIT;
4

3 に答える 3

0

Comman Table Expression ( https://forums.oracle.com/thread/921467 ) と OVER ( http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions137.htm ) を使用して達成できます。結果。以下のクエリは SQL Server に関するものです。Oracle でも同じことが言えます。また、同じ試験の最新の試験結果を特定するために、テーブルにExamDateがあります

;WITH    CTE_StudentResult
          AS ( SELECT   StudentId ,
                        PercentCorrect ,
                        ROW_NUMBER() OVER ( PARTITION BY StudentId ORDER BY percentcorrect DESC, ExamDate DESC ) AS RowNumber
               FROM     tbl
             )
    SELECT  StudentId ,
            PercentCorrect
    FROM    CTE_StudentResult
    WHERE   RowNumber = 1
于 2013-07-23T12:40:00.323 に答える
0

これを試して

SELECT DISTINCT * FROM tbl
WHERE (studentid, percentcorrect, attempt) IN (
        SELECT   studentid, percentcorrect, MAX (attempt)
        FROM tbl
        WHERE (studentid, percentcorrect) IN (SELECT   studentid,MAX (percentcorrect)FROM tbl GROUP BY studentid)
        GROUP BY studentid, percentcorrect)
于 2013-07-23T12:49:23.540 に答える