Oracle SQL - Выберите максимальное значение из функции RN, но обновите все поля этим значением - PullRequest
0 голосов
/ 28 мая 2020

Мой запрос выглядит следующим образом:

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'; 

Это дает мне 6 записей с 1 GXS_DATE и X_ACK_TYPE = 'Absent'. Здесь нужна функция RN, чтобы извлечь только 1 запись из подзапроса, но требуется, чтобы все 6 записей имели одинаковую дату и ACK_TYPE, чего не происходит. Как я могу этого добиться? Пожалуйста, обратитесь к приведенному ниже снимку экрана, и мне нужно X_ACK_TYPE = AK для всех 6 LINE_NUM и GXS_DATE = 3/6/2020 для всех этих 6 записей.

Мой текущий снимок экрана с данными здесь

1 Ответ

0 голосов
/ 28 мая 2020

Вместо

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 

или Если всегда будет одно значение ACK_TABLE.GXS_DATE существует на HEADER_TABLE.SEGMENT1, тогда вы можете просто написать его как

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

- Обновление -

для ACK_TYPE, вам нужно применить тот же лог c в ELSE части вашего оператора CASE из исходного запроса следующим образом:

Замените это:

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

На это:

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