8

説明するのは比較的簡単ですが、(私のスキルがやや限られているため)SQLクエリを書くのは難しいです。

次のようなテーブルがあるとします。

 exam_no | name | surname | result | date
---------+------+---------+--------+------------
 1       | John | Doe     | PASS   | 2012-01-01
 1       | Ryan | Smith   | FAIL   | 2012-01-02 <--
 1       | Ann  | Evans   | PASS   | 2012-01-03
 1       | Mary | Lee     | FAIL   | 2012-01-04
 ...     | ...  | ...     | ...    | ...
 2       | John | Doe     | FAIL   | 2012-02-01 <--
 2       | Ryan | Smith   | FAIL   | 2012-02-02
 2       | Ann  | Evans   | FAIL   | 2012-02-03
 2       | Mary | Lee     | PASS   | 2012-02-04
 ...     | ...  | ...     | ...    | ...
 3       | John | Doe     | FAIL   | 2012-03-01
 3       | Ryan | Smith   | FAIL   | 2012-03-02
 3       | Ann  | Evans   | PASS   | 2012-03-03
 3       | Mary | Lee     | FAIL   | 2012-03-04 <--

exam_no私が選んだ種類の例から予想されるように、とdateは必ずしも関連していないことに注意してください。

ここで、実行する必要があるクエリは次のとおりです。

  • 最新の試験 ( = 3) から、不合格 ( 、および)exam_noのすべての学生を見つけます。John DoeRyan SmithMary Lee
  • これらの学生のそれぞれについて、連続して失敗した試験のバッチの最初の日付を見つけます。別の言い方をすると、これらの生徒のそれぞれについて、最後に合格した試験の後に来る最初の不合格の試験の日付を見つけます。(表の矢印を見てください)。

結果のテーブルは次のようになります。

 name | surname | date_since_failing
------+---------+--------------------
 John | Doe     | 2012-02-01
 Ryan | Smith   | 2012-01-02
 Mary | Lee     | 2012-03-04

このようなクエリを実行するにはどうすればよいですか?

お時間をいただきありがとうございます。

4

4 に答える 4

4

誰かが最新の試験に合格した場合、最新の合格以降に不合格になった人はいないという事実を利用できます。したがって、問題は、最新の合格以降の最初の試験が不合格になったことを見つけることになります。

SELECT   name, surname, MIN(date) date_since_fail
FROM     results NATURAL LEFT JOIN (
  SELECT   name, surname, MAX(date) lastpass
  FROM     results
  WHERE    result = 'PASS'
  GROUP BY name, surname
) t
WHERE    result = 'FAIL' AND date > IFNULL(lastpass,0)
GROUP BY name, surname

sqlfiddleで参照してください。

于 2012-07-04T13:52:06.347 に答える
0

あなたが求めている状態は、あなたがそれなしでそれを行うことができる何のためにも良いです. これが実際の例です。

select
  e.name,
  e.sur_name,
  min(e.date) as `LastFailed`
from exams as e
where e.result = 'Fail'
group by e.name
    order by e.name 

これにより、この結果が生成されます

name            sur_name    LastFailed
Ann         Evans       2012-02-03
John        Doe         2012-02-01
Mary        Lee         2012-01-04
Ryan        Smith       2012-01-02
于 2012-07-04T13:51:18.897 に答える
0

次のような、最後に合格した試験を取得するサブクエリを使用する必要があります。

SET @query_exam_no = 3;
SELECT
 name,
 surname,
 MIN(IF(date > last_passed_exam, date, NULL)) AS date_failing_since
FROM
 exam_results
 LEFT JOIN (
  SELECT
   name,
   surname, 
   MAX(date) AS last_passed_exam 
  FROM exam_results 
  WHERE result = 'PASS' 
  GROUP BY name, surname
 ) AS last_passed_exams USING (name, surname)
HAVING
 MAX(IF(exam_no = @query_exam_no, result, NULL)) = 'FAIL'
GROUP BY name, surname
于 2012-07-04T13:45:19.177 に答える
0

これで十分です:

select t.name,
       t.surname,
       t.date as 'date_since_failing'
from tablename t
inner join
(
    select name,
           surname,
           max(exam_no) as exam_no
    from tablename
    group by name, surname
    having min(result) = 'FAIL'
) aux on t.name = aux.name and t.surname = aux.surname and t.exam_no = aux.exam_no
于 2012-07-04T13:48:17.437 に答える