oraclesql—从rn函数中选取最大值,但用该值更新所有字段

okxuctiv  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(498)

我的问题如下

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_日期,x_ack_type='缺席'。这里需要rn函数只从子查询中提取1条记录,但要求所有6条记录都具有相同的日期和确认类型,这是不发生的。我怎样才能做到这一点?请参考下面的屏幕截图,我需要所有6行数字的x_ack_type=ak和所有这6条记录的gxs_date=3/6/2020。
我的当前数据截图在这里

l3zydbqr

l3zydbqr1#

而不是

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 ,则需要在中应用相同的逻辑 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

相关问题