programing

부모 레코드별 최신 자식 레코드(조건 포함) 찾기

starjava 2023. 9. 9. 08:50
반응형

부모 레코드별 최신 자식 레코드(조건 포함) 찾기

부모/자녀 계층이 있는 테이블이 2개 있고 각 부모 레코드에 대한 최신 자녀 레코드의 ID를 풀려고 하지만 풀 중인 자녀 레코드에 적용되는 조건도 있습니다.

제 테이블은 다음과 같습니다.

-----------
| Quizzes |
-----------
| ID      | 
-----------
| 1       |
| 2       |
| 3       |
-----------

-------------------------------------
| QuizAttempts                      |
-------------------------------------
| ID | QuizID | AttemptedAt         |
-------------------------------------
| 1  | 1      | 2021-01-01 05:00:00 |
| 2  | 1      | 2021-01-01 08:30:00 |
| 3  | 2      | 2021-01-01 05:00:00 |
| 4  | 3      | 2021-01-01 07:00:00 |
| 5  | 3      | 2021-02-01 07:00:00 |
| 6  | 3      | 2021-03-01 07:00:00 |
-------------------------------------

자, 제가 최근의 아이디를 뽑고 싶다고 치자.QuizAttempt일별로Quiz에서 시도된 것입니다.2021-01-01 00:00:00로.2021-01-01 23:59:59이와 같은 모습을 하고 있습니다.

------------------------------------------------
| QuizID | QuizAttemptID | AttemptedAt         |
------------------------------------------------
| 1      | 2             | 2020-01-01 08:30:00 |
| 2      | 3             | 2020-01-01 05:00:00 |
| 3      | 4             | 2020-01-01 07:00:00 |
------------------------------------------------

현재 최신 QC를 끌어오기 위해 ID를 비교하기 위해 자기 참조 가입을 수행하고 있습니다.

SELECT attempts1.ID
FROM QuizAttempts AS attempts1
LEFT OUTER JOIN QuizAttempts AS attempts2
ON (attempts1.QuizID = attempts2.QuizID
    AND attempts1.ID < attempts2.ID)
WHERE attempts2.ID IS NULL;

최신 아동 기록을 끄집어낼 때 효과가 있습니다그러나 날짜 범위 조건을 추가할 때(추가하는 것과 같이)attempts1.AttemptedAt BETWEEN '2021-01-01 00:00:00' AND '2021-01-01 23:59:59'), 빈 결과가 나옵니다.

하위 쿼리에서 창 기능을 제안합니다.

SELECT qa.*
FROM (SELECT qa.*,
             ROW_NUMBER() OVER (PARTITION BY QuizID ORDER BY id DESC) as seqnum
      FROM QuizAttempts qa
      WHERE qa.attemptedat >= '2021-01-01' AND
            qa.attemptedat < '2021-01-02'
     ) qa
WHERE seqnum = 1;

시간 성분을 처리할 필요 없이 날짜 연산이 훨씬 간단합니다.

편집:

상관된 하위 쿼리를 사용할 수도 있습니다.

SELECT qa.*
FROM QuizAttempts qa
WHERE qa.id = (SELECT MAX(qa2.id),
               FROM QuizAttempts qa2
               WHERE qa2.QuizID = qa.QuizID AND
                     qa2.attemptedat >= '2021-01-01' AND
                     qa2.attemptedat < '2021-01-02'
              ) qa;

언급URL : https://stackoverflow.com/questions/68536489/find-latest-child-record-with-conditions-per-parent-record

반응형