Oracle - 行聚合和分区集的空处理
Oracle - Aggregation of rows and null handling for partitioned set
给定以下数据结构:
CREATE TABLE ETL_TEST
(
CASE_NO NUMBER(10,0),
LINE_NO NUMBER(10,0),
COLUMN_NAME VARCHAR2(18),
CHANGE_DATE DATE,
NEW_ENTRY VARCHAR2(255),
OLD_ENTRY VARCHAR2(255),
CONSTRAINT CASE_PK
PRIMARY KEY (CASE_NO, LINE_NO, COLUMN_NAME)
);
这里是测试数据http://sqlfiddle.com/#!4/2f718c/1
对于每组 CASE_NO 和 LINO_NO 必须创建一个包含列 CASE_NO、LINE_NO 和 REASON_TEXT 的聚合行,其中 REASON_TEXT 包含 NEW_ENTRY 的数据 if COLUMN_NAME = 'REASON_TEXT'.
如果COLUMN_NAME = 'REASON_TEXT'为null或者没有COLUMN_NAME = 'REASON_TEXT'则前一个LINO_NO的数据其中COLUMN_NAME = 'REASON_TEXT' 必须选择(如果存在这样的条目)。
这张图片应该能说明问题
我想知道这是否可以通过纯 Oracle SQL 实现。我会知道谁在 PL/SQL 中解决这个问题,但使用纯 SQL?挑战在于COLUMN_NAME = 'REASON_TEXT'没有固定的数量,因为它可以是零个也可以是多个
您可以使用 window 函数来填充缺失的数据 -- 在本例中 last_value()
使用 ignore nulls
选项:
select case_no, line_no,
max(case when column_name = 'REASON_TEXT' then new_entry end) as line_reason,
last_value( max(case when column_name = 'REASON_TEXT' then new_entry end) ignore nulls
) over
(partition by case_no order by line_no
) as imputed_reason_text
from etl_test
group by case_no, line_no
order by 1, 2;
Here 是 SQL Fiddle.
给定以下数据结构:
CREATE TABLE ETL_TEST
(
CASE_NO NUMBER(10,0),
LINE_NO NUMBER(10,0),
COLUMN_NAME VARCHAR2(18),
CHANGE_DATE DATE,
NEW_ENTRY VARCHAR2(255),
OLD_ENTRY VARCHAR2(255),
CONSTRAINT CASE_PK
PRIMARY KEY (CASE_NO, LINE_NO, COLUMN_NAME)
);
这里是测试数据http://sqlfiddle.com/#!4/2f718c/1
对于每组 CASE_NO 和 LINO_NO 必须创建一个包含列 CASE_NO、LINE_NO 和 REASON_TEXT 的聚合行,其中 REASON_TEXT 包含 NEW_ENTRY 的数据 if COLUMN_NAME = 'REASON_TEXT'.
如果COLUMN_NAME = 'REASON_TEXT'为null或者没有COLUMN_NAME = 'REASON_TEXT'则前一个LINO_NO的数据其中COLUMN_NAME = 'REASON_TEXT' 必须选择(如果存在这样的条目)。
这张图片应该能说明问题
我想知道这是否可以通过纯 Oracle SQL 实现。我会知道谁在 PL/SQL 中解决这个问题,但使用纯 SQL?挑战在于COLUMN_NAME = 'REASON_TEXT'没有固定的数量,因为它可以是零个也可以是多个
您可以使用 window 函数来填充缺失的数据 -- 在本例中 last_value()
使用 ignore nulls
选项:
select case_no, line_no,
max(case when column_name = 'REASON_TEXT' then new_entry end) as line_reason,
last_value( max(case when column_name = 'REASON_TEXT' then new_entry end) ignore nulls
) over
(partition by case_no order by line_no
) as imputed_reason_text
from etl_test
group by case_no, line_no
order by 1, 2;
Here 是 SQL Fiddle.