프로그래밍 언어/Database

각 그룹의 상위 1 개 행 가져 오기

Rateye 2021. 9. 9. 12:08
728x90
반응형
질문 : 각 그룹의 상위 1 개 행 가져 오기

각 그룹에 대한 최신 항목을 얻고 싶은 테이블이 있습니다. 표는 다음과 같습니다.

DocumentStatusLogs 테이블

|ID| DocumentID | Status | DateCreated |
| 2| 1          | S1     | 7/29/2011   |
| 3| 1          | S2     | 7/30/2011   |
| 6| 1          | S1     | 8/02/2011   |
| 1| 2          | S1     | 7/28/2011   |
| 4| 2          | S2     | 7/30/2011   |
| 5| 2          | S3     | 8/01/2011   |
| 6| 3          | S1     | 8/02/2011   |

테이블은 DocumentID DateCreated 별로 내림차순으로 정렬됩니다. 각 DocumentID 에 대해 최신 상태를 얻고 싶습니다.

내가 선호하는 출력 :

| DocumentID | Status | DateCreated |
| 1          | S1     | 8/02/2011   |
| 2          | S3     | 8/01/2011   |
| 3          | S1     | 8/02/2011   |
  • 각 그룹에서 상위 만 가져 오는 집계 함수가 있습니까? 아래 의사 코드 GetOnlyTheTop 참조하십시오.
    SELECT
      DocumentID,
      GetOnlyTheTop(Status),
      GetOnlyTheTop(DateCreated)
    FROM DocumentStatusLogs
    GROUP BY DocumentID
    ORDER BY DateCreated DESC
  • 이러한 기능이 존재하지 않는 경우 원하는 출력을 얻을 수있는 방법이 있습니까?
  • 아니면 처음에는 정규화되지 않은 데이터베이스로 인해 발생할 수 있습니까? 내가 찾고있는 것은 단지 하나의 행이기 때문에 그 status 도 부모 테이블에 있어야합니까?

 

 

자세한 내용은 상위 테이블을 참조하십시오.

현재 Documents 테이블

| DocumentID | Title  | Content  | DateCreated |
| 1          | TitleA | ...      | ...         |
| 2          | TitleB | ...      | ...         |
| 3          | TitleC | ...      | ...         |

상태에 쉽게 액세스 할 수 있도록 상위 테이블이 이와 같아야합니까?

| DocumentID | Title  | Content  | DateCreated | CurrentStatus |
| 1          | TitleA | ...      | ...         | s1            |
| 2          | TitleB | ...      | ...         | s3            |
| 3          | TitleC | ...      | ...         | s1            |

업데이트 나는 이러한 문제를보다 쉽게 해결할 수 있도록 "apply"를 사용하는 방법을 배웠습니다.

답변

;WITH cte AS
(
   SELECT *,
         ROW_NUMBER() OVER (PARTITION BY DocumentID ORDER BY DateCreated DESC) AS rn
   FROM DocumentStatusLogs
)
SELECT *
FROM cte
WHERE rn = 1

하루에 2 개의 항목을 예상하면 임의로 하나를 선택합니다. 하루에 두 항목을 모두 가져 오려면 대신 DENSE_RANK를 사용하세요.

정규화 여부는 다음을 원하는지 여부에 따라 다릅니다.

  • 2 곳에서 지위 유지
  • 상태 기록 보존
  • ...

현재 상태 기록을 보존합니다. 부모 테이블에서도 최신 상태 (비정규 화)를 원한다면 부모에서 "상태"를 유지하기위한 트리거가 필요합니다. 또는이 상태 기록 테이블을 삭제하십시오.

출처 : https://stackoverflow.com/questions/6841605/get-top-1-row-of-each-group
728x90
반응형