2012-05-04 6 views
14

Mam tabeli, który wygląda tak:SQL Wyświetl najnowszy rekord w 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 

Próbuję GROUP BY SubjectCode ale chciałbym go do wyświetlania najnowszą DateApproved tak będzie wyglądać następująco:

id | SubjectCode | Grade | DateApproved | StudentId 

2   SUB123   2.00   1/5/2012   2012-12345 

3   SUB123   3.00   1/5/2012   2012-98765 

Jestem trochę zagubiony, jak to zrobić?

EDIT:

Ok chłopaki teraz im o moim prawdziwym komputerze, przepraszam za źle skonstruowane pytanie.

Oto co ja rzeczywiście próbuje zrobić:

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 

Zasadniczo, chcę tylko, aby wyświetlić najnowszą „DateApprove” o „SubjectCode”, więc nie dostać wiele wpisów .

+0

rzeczywiście chcesz grupy przez StudentId. Aby to zrobić, należy wybrać opcję max (DateApproved). (Zakładając, że DateApproved jest polem daty) –

+0

OK, DateApproved jest VARCHAR, czy to zadziała: MAX (STR_TO_DATE (DateApproved, '% d% m% y'))? –

+0

Hmm. Warte strzału. Musisz spróbować i zobaczyć. Nie jestem zbyt obeznany ze składnią mysql. –

Odpowiedz

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

zacząć od tego:

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

Następnie zintegrować że do zapytania głównego:

select * 
from tbl 
where (StudentId, DateApproved) in 

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

Można również użyć tego:

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

Ale wolę testowania krotka , to jest sposób neater

żywo Test: http://www.sqlfiddle.com/#!2/771b8/5

7
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 
+0

H eprobably potrzebuje 'GROUP BY StudentId, SubjectCode' (i odpowiednio zmieniony warunek" ON "). Ale to jest droga. –