oracle 中的 MAX 函数没有拉回预期结果

MAX function in oracle not pulling back expected results

我有 table 有一堆数据。数据示例如下强调文本

DTE UNIQUE_ID ROW_DATA CALL_ROW_ID
8/1/2021 11234 DCNS=FAILED\|HYPO= 1
8/1/2021 11234 DCNS=ACCEPTED \| HYPO=NEW CREDIT 2
8/1/2021 11234 DCNS=FAILED\|HYPO=GIVE ME BIRTHDAY= 4
8/1/2021 11234 DCNS=ACCEPTED\|HYPO=YES 7
8/1/2021 11234 DCNS=CONFIRMED\|HYPO=JULY 25th 2019 10

我有一个查询试图将某些数据堆叠在一行中。查询试图拉回:日期,unique_id,并获取第一个和最后一个 HYPO。

SELECT
    DTE,
    UNIQUE_ID,
    MIN(CASE WHEN HYPO > 0 THEN TRIM(SUBSTR(ROW_DATA, HYPO + 7, INSTR(ROW_DATA, '|', HYPO + 7) - (HYPO + 7))) END ) FIRST_HYPO,
    MAX(CASE WHEN HYPO > 0 THEN TRIM(SUBSTR(ROW_DATA, HYPO + 7, INSTR(ROW_DATA, '|', HYPO + 7) - (HYPO + 7))) END ) LAST_HYPO
FROM
    (SELECT DTE, UNIQUE_ID, ROW_DATA, INSTR(ROW_DATA, '| HYPO=') as HYPO
    FROM
        (SELECT TO_CHAR(DTE, 'MM/DD/YYYY' AS DTE, UNIQUE_ID, '| ' || ROW_DATA || ' |' as ROW_DATA, CALL_ROW_ID
        FROM DATATABLE))

我想得到的是:

DTE UNIQUE_ID FIRST_HYPO LAST_HYPO
8/1/2021 11234 NEW_CREDIT JULY 25th 2019

但我得到的是

DTE UNIQUE_ID FIRST_HYPO LAST_HYPO
8/1/2021 11234 GIVE ME BIRTHDAY YES

这很奇怪,因为数据是有序的,但 MIN/MAX 选择了不同的行。我尝试在查询的所有级别执行 ORDER BY,但它没有修复结果。它总是拉回相同的字段。

有人知道如何解决这个问题吗?

'YES' 是最大hypo。它以 'Y' 开头,因此在字母表中排在最后。假设您的样本数据中有错别字,意外地在行中省略了 HYPO=,那么 'GIVE ME BIRTHDAY' 将是最小的假设。它以 'G' 开头,并且是按字母顺序排列的第一个。

你说你想要第一个和最后一个假设,并希望 Oracle 神奇地知道你首先和最后考虑的是什么,并相应地应用 MIN/MAX。我想您的想法是查看所有带有 hypo(call_row_id 2、7 和 10)的行,其中首先考虑具有最低 call_row_id 的行和具有最大 call_row_id 的行=12=]最后一个。

您在 Oracle KEEP FIRST/LAST.

的聚合中获得了第一行和最后一行的值
select
  dte, unique_id,
  max(hypo) keep (dense_rank first order by nvl2(hypo, 1, 2), call_row_id) as first_hypo,
  max(hypo) keep (dense_rank last  order by nvl2(hypo, 2, 1), call_row_id) as last_hypo
from
(
  select
    dte, unique_id, call_row_id,
    trim(regexp_replace(row_data, '^.*HYPO=(.*)$', '')) as hypo
  from datatable
)
group by dte, unique_id
order by dte, unique_id;

演示:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=ab99c199b1c3ce49a2029f0205700e14