SQL Показать самую последнюю запись в GROUP BY?

У меня есть таблица, которая выглядит так:

id    |    SubjectCode    |    Grade    |    DateApproved    |    StudentId

1            SUB123            1.25            1/4/2012            2012-12345

2            SUB123            2.00            1/5/2012            2012-12345

3            SUB123            3.00            1/5/2012            2012-98765   

Я пытаюсь GROUP BY SubjectCode, но мне бы хотелось, чтобы он отображал самую последнюю DateApproved, чтобы она выглядела так:

  id    |    SubjectCode    |    Grade    |    DateApproved    |    StudentId

2            SUB123            2.00            1/5/2012            2012-12345

3            SUB123            3.00            1/5/2012            2012-98765  

Я немного потерял, как это сделать?

EDIT:

Хорошо, ребята, теперь я на моем реальном ПК, извините за плохо сконструированный вопрос.

Вот что я на самом деле пытаюсь сделать:

SELECT GD.GradebookDetailId, G.SubjectCode, G.Description, G.UnitsAcademic, G.UnitsNonAcademic, 
GD.Grade, GD.Remarks, G.FacultyName, STR_TO_DATE(G.DateApproved, '%m/%d/%Y %h:%i:%s') AS 'DateAproved'
FROM gradebookdetail GD INNER JOIN gradebook G ON GD.GradebookId=G.GradebookId 
WHERE G.DateApproved IS NOT NULL AND G.GradebookType='final' AND StudentIdNumber='2012-12345'

GROUP BY <?????>
ORDER BY G.SubjectCode ASC

В принципе, я хочу показать только последнее "DateApprove" "SubjectCode", поэтому я не получаю несколько записей.

Ответ 1

Начните с этого:

select StudentId, max(DateApproved) 
from tbl
group by StudentId

Затем интегрируйте это в основной запрос:

select * 
from tbl
where (StudentId, DateApproved) in

(
  select StudentId, max(DateApproved) 
  from tbl
  group by StudentId
)

Вы также можете использовать это:

select * 
from tbl
join (select StudentId, max(DateApproved) as DateApproved 
      from tbl 
      group by StudentId)
using (StudentId, DateApproved)

Но я предпочитаю тестирование кортежа, его способ neater

Live test: http://www.sqlfiddle.com/#!2/771b8/5

Ответ 2

SELECT t2.*
FROM temp t2 
INNER JOIN(
    SELECT MAX(DateApproved) as MaxDate, StudentId
    FROM temp
    GROUP BY StudentId
    ) t1 ON t1.MaxDate = t2.DateApproved and t1.StudentId = t2.StudentId

Ответ 3

SELECT *
FROM TheTable a
WHERE NOT EXISTS(SELECT *
                 FROM TheTable b
                 WHERE b.StudentCode = a.StudentCode AND b.DateApproved > a.DateApproved)