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
我有 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