web-dev-qa-db-ja.com

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   

SubjectCodeでGROUPしようとしていますが、最新のDateApprovedを表示して、次のように表示したいと思います。

  id    |    SubjectCode    |    Grade    |    DateApproved    |    StudentId

2            SUB123            2.00            1/5/2012            2012-12345

3            SUB123            3.00            1/5/2012            2012-98765  

私はそれを行う方法に少し迷っていますか?

編集:

わかりました。質問がうまく構成されていなくてすみません。

これが私が実際にやろうとしていることです:

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

基本的には、「SubjectCode」の最新「DateApprove」のみを表示したいので、複数のエントリを取得しません。

18
A.B. User

これから始めましょう:

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

ライブテスト: http://www.sqlfiddle.com/#!2/771b8/5

27
Michael Buen
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
7
Jaimal Chohan
SELECT *
FROM TheTable a
WHERE NOT EXISTS(SELECT *
                 FROM TheTable b
                 WHERE b.StudentCode = a.StudentCode AND b.DateApproved > a.DateApproved)
0
erikkallen