如何在Oracle混杂表头内容数据场景下实现control break类型SQL
Oracle 连续序列下Header与Content行关联实现
实现逻辑
通过窗口函数的累计分区特性,按照id顺序将每个Header与其后续直到下一个Header前的所有Content行划归为同一逻辑组,最终将组内的Header文本与Content文本拼接输出,完全匹配“Content行关联之前最近的Header行”的规则。
实现步骤
- 识别表中所有满足
text LIKE '%Header%'的Header行 - 按id顺序累计统计Header出现的次数,将该累计值作为分组ID:Header行出现时累计值+1,Content行沿用之前的累计值,实现Header与后续Content自动同组
- 以分组ID为分区,提取每个组内唯一的Header文本,作为同组所有Content行的关联Header值
- 过滤掉原始的Header行,将Header文本与Content文本按格式拼接为最终输出
参考SQL
SELECT header_text || ' ' || content_text AS output_content FROM ( SELECT text AS content_text, MAX(CASE WHEN text LIKE '%Header%' THEN text END) OVER (PARTITION BY group_id) AS header_text, CASE WHEN text LIKE '%Header%' THEN 1 ELSE 0 END AS row_type FROM ( SELECT id, text, SUM(CASE WHEN text LIKE '%Header%' THEN 1 ELSE 0 END) OVER (ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS group_id FROM 存储原始文本的表名 ) base_data ) processed_data WHERE row_type = 0 ORDER BY id;
边界说明
如果存在数据开头无前置Header的Content行,这类行的分组ID为0,对应的关联Header值为NULL,可根据业务需求决定是过滤这类行还是补充默认前缀。
内容的提问来源于stack exchange,提问作者Woodchuck
相关产品推荐
相关产品推荐

