sql - Oracle - 分区集的行聚合和空处理
问题描述
给定以下数据结构:
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,如果 COLUMN_NAME = 'REASON_TEXT',则必须创建包含 CASE_NO、LINE_NO 和 REASON_TEXT 列的聚合行,其中 REASON_TEXT 包含 NEW_ENTRY 的数据。
如果 COLUMN_NAME = 'REASON_TEXT' 为空或没有 COLUMN_NAME = 'REASON_TEXT',则必须选择前一个 LINO_NO 的数据,其中 COLUMN_NAME = 'REASON_TEXT' (如果存在这样的条目)。
这张图片应该澄清它
我想知道这是否可以通过纯 Oracle SQL 实现。我会知道谁在 PL/SQL 中解决这个问题,但是使用纯 SQL?挑战在于没有固定数量的 COLUMN_NAME = 'REASON_TEXT',因为它可以是零个或多个。
解决方案
您可以使用窗口函数来填充缺失的数据——在这种情况下,可以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;
这是一个 SQL 小提琴。
推荐阅读
- java - LinkedBlockingQueue 何时优于 ConcurrentLinkedQueue?
- arrays - 对象数组内的弹性搜索查询
- python - 带有查询返回值的 Sqlite OperationalError
- reactjs - 在 render() 中反应 setState
- android - 无法获取“https://google.bintray.com/flexbox-layout/com/google/android/flexbox/1.0.0/flexbox-1.0.0.pom”
- python - 使用 Python Cx_Oracle 将 7L 行的 185 列插入到 Oracle sql 表中
- cmake - CMake target_include_directories 相对于父目录?
- c++ - 在记事本中编辑/替换值文件
- r - 逻辑索引时是否有用 0 替换消失值的功能?
- java - 使用 Java Socket 和 java.nio.file.Files.copy 发送文件