잡동사니

반응형

질문

내 쿼리는 다음과 같습니다.

SELECT HEADER_TABLE.SEGMENT1,
       LINES_TABLE.LINE_NUM,
       CASE
          WHEN (    HEADER_TABLE.REVISION_NUM = '0'
                AND HEADER_TABLE.PRINT_COUNT = '0')
          THEN
             'Unavailable'
          ELSE
             NVL (ACK_TABLE.ACK_TYPE, 'Absent')
       END
          AS X_ACK_TYPE,
       ACK_TABLE.GXS_DATE
  FROM HEADER_TABLE,
       LINES_TABLE,
       (SELECT po_number,
               po_line_number,
               gxs_date,
               po_ack_filename,
               ack_type
          FROM (SELECT po_number,
                       po_line_number,
                       gxs_date,
                       po_ack_filename,
                       ack_type,
                       ROW_NUMBER ()
                       OVER (PARTITION BY po_number ORDER BY gxs_date DESC)
                          rn
                  FROM xxcmst_po_ack_from_gxs_stg)
         WHERE rn = 1) ACK_TABLE,
       (SELECT PO_NUMBER FROM XXCMST.XXCMST_ACTION_TABLE_ACKNOWLEDGEMENT) ACTION_TABLE
 WHERE     HEADER_TABLE.PO_HEADER_ID = LINES_TABLE.PO_HEADER_ID
       AND HEADER_TABLE.SEGMENT1 = ACK_TABLE.PO_NUMBER(+)
       AND HEADER_TABLE.SEGMENT1 = ACTION_TABLE.PO_NUMBER(+)
       AND LINES_TABLE.LINE_NUM = ACK_TABLE.PO_LINE_NUMBER(+)
       AND HEADER_TABLE.SEGMENT1 = '100'; 

이것은 1 GXS_DATE 및 X_ACK_TYPE = 'Absent'인 6 개의 레코드를 제공합니다. 여기서 RN 함수는 하위 쿼리에서 1 개의 레코드 만 가져 오는 데 필요하지만 6 개의 레코드 모두가 동일한 날짜와 발생하지 않는 ACK_TYPE을 갖도록하는 것입니다. 이것을 어떻게 할 수 있습니까? 아래 스크린 샷을 참조하세요. 6 개의 LINE_NUM 모두에 대해 X_ACK_TYPE = AK가 필요하고이 6 개 레코드 모두에 대해 GXS_DATE = 3/6/2020이 필요합니다.

여기에 내 현재 데이터 스크린 샷


답변1

대신에

ACK_TABLE.GXS_DATE

SELECT절에서 다음과 같이 LAG함수를 사용합니다.

CASE WHEN ACK_TABLE.GXS_DATE IS NOT NULL 
     THEN ACK_TABLE.GXS_DATE
     ELSE LAG(ACK_TABLE.GXS_DATE IGNORE NULLS) 
                OVER (PARTITION BY HEADER_TABLE.SEGMENT1 ORDER BY LINES_TABLE.LINE_NUM )
END AS GXS_DATE 

또는 HEADER_TABLE.SEGMENT1당 항상 하나의 ACK_TABLE.GXS_DATE값이 존재한다면 간단히 다음과 같이 작성할 수 있습니다.

MIN(ACK_TABLE.GXS_DATE)
    OVER (PARTITION BY HEADER_TABLE.SEGMENT1) AS GXS_DATE

-업데이트-

ACK_TYPE 의 경우 다음과 같이 원래 쿼리에서 CASE 문의 ELSE부분에 동일한 논리를 적용해야합니다.

이것을 교체하십시오 :

ELSE
    NVL (ACK_TABLE.ACK_TYPE, 'Absent')
END

이것으로 :

ELSE
    NVL (MIN(ACK_TABLE.ACK_TYPE)
           OVER (PARTITION BY HEADER_TABLE.SEGMENT1), 'Absent')
END


 

 

 

 

출처 : https://stackoverflow.com/questions/62068752/oracle-sql-pick-max-value-from-rn-function-but-update-all-fields-with-that-va

반응형

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band