programing

SQL GROUP BY에서 가장 최근 기록을 표시하시겠습니까?

sourcejob 2023. 9. 21. 20:17
반응형

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   

제목 코드별로 그룹화하려고 하는데 다음과 같이 표시되도록 가장 최근에 승인된 날짜가 표시되었으면 합니다.

  id    |    SubjectCode    |    Grade    |    DateApproved    |    StudentId

2            SUB123            2.00            1/5/2012            2012-12345

3            SUB123            3.00            1/5/2012            2012-98765  

어떻게 해야 할지 좀 막막한데요?

편집:

좋아 얘들아, 나는 이제 내 진짜 PC에 있어, 질문이 잘못 구성되어서 미안.

제가 실제로 하려는 것은 다음과 같습니다.

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"의 가장 최근의 "DateApproval"만 표시하고 싶어서 여러 항목이 표시되지 않습니다.

시작은 다음과 같습니다.

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)

하지만 전 튜플 테스트가 더 좋아요. 훨씬 더 적어요.

라이브 테스트: http://www.sqlfiddle.com/ #!2/771b8/5

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

이 글을 쓸 당시(2020년)에도 튜플을 지원하지 않는 SQL Server에서 이를 시도하는 사용자의 경우 다음을 사용할 수 있습니다(여기서 다른 답변을 개선).

변경 내용:

-- MYSQL
select * 
from tbl
where (StudentId, DateApproved) in
(
  select StudentId, max(DateApproved) 
  from tbl
  group by StudentId
)

다음 항목으로 이동합니다.

-- Microsoft SQL Server
select * 
from tbl
where concat(StudentId, DateApproved) in
(
  select concat(StudentId, max(DateApproved)) 
  from tbl
  group by StudentId
)
SELECT *
FROM TheTable a
WHERE NOT EXISTS(SELECT *
                 FROM TheTable b
                 WHERE b.StudentCode = a.StudentCode AND b.DateApproved > a.DateApproved)

이것이 저에게는 포스트그레스에서 더 효율적이었습니다.

select * from tbl t1 where t1.DateApproved = (select max(t2.DateApproved) from tbl t2 where t2.StudentId = t1.StudentId)

이 코드는 SQL Server 2016에서 작동합니다.

학생별 tbl 그룹에서 StudentId, max(Date Approved)를 선택합니다.이드

이 코드에는 학생 ID당 승인된 날짜와 날짜가 표시됩니다.

StudentId, max(승인 날짜), min(승인 날짜)을 선택합니다.
학생별 tbl그룹에서이드

언급URL : https://stackoverflow.com/questions/10445162/sql-show-most-recent-record-in-group-by

반응형