programing

조건이 충족되면 A행 선택, 그렇지 않으면 각 그룹에 대해 B행 선택

goodsources 2023. 8. 19. 10:15
반응형

조건이 충족되면 A행 선택, 그렇지 않으면 각 그룹에 대해 B행 선택

2개의 테이블과 예약, 서류가 있습니다.

예약

booking_id    |  name    
100           |  "Val1"  
101           |  "Val5"  
102           |  "Val6"

문서

doc_id  |  booking_id  |  doc_type_id  
6       |  100         | 1
7       |  100         | 2
8       |  101         | 1
9       |  101         | 2
10      |  101         | 2

다음과 같은 결과가 필요합니다.

booking_id | doc_id
100        | 7
101        | 10

기본적으로 문서 예약의 최신 기록을 가져오려고 하지만 doc_type_id 2가 있는 경우 doc_type_id 2의 최신 기록을 선택하거나 doc_type_id 1의 최신 기록을 선택합니다.

매우 큰 쿼리에 이를 적용해야 하는데 성능 친화적인 쿼리로 이를 달성할 수 있습니까?

로 할 수 있습니다.FIRST_VALUE()각 행을 적절하게 정렬하여 창 기능booking_id와의 관계를 유지하기 위해doc_type_id = 2먼저 반환됩니다.

SELECT DISTINCT booking_id,  
       FIRST_VALUE(doc_id) OVER (PARTITION BY booking_id ORDER BY doc_type_id = 2 DESC, doc_id DESC) rn
FROM docs;

전체 행을 반환하려면 다음을 사용할 수 있습니다.ROW_NUMBER()창 기능:

SELECT booking_id, doc_id, doc_type_id  
FROM (
  SELECT *, 
         ROW_NUMBER() OVER (PARTITION BY booking_id ORDER BY doc_type_id = 2 DESC, doc_id DESC) rn
  FROM docs
) t
WHERE rn = 1;

언급URL : https://stackoverflow.com/questions/69544869/select-row-a-if-a-condition-satisfies-else-select-row-b-for-each-group

반응형