Oracle 10g:如何基于聚合条件将表A行插入表B
解决方案:聚合+插入一步完成
没问题,你可以直接通过INSERT INTO ... SELECT ...的组合语句,把聚合计算和插入操作合并完成,同时精准过滤出你需要的FLAG值。下面是具体实现方案:
先明确你的表结构与数据
表A的结构和原始数据
| DT | FLAG |
|---|---|
| 2015-MAY | E |
| 2015-JUN | H |
| 2015-OCT | S |
| 2016-FEB | E |
表B的目标结构
| FLAG | DTFROM | DTFTO |
|---|---|---|
| ... | ... | ... |
实现语句(分两种场景)
场景1:数据库支持WHERE子句使用窗口函数(如PostgreSQL 12+)
直接在插入语句中完成聚合和过滤:
INSERT INTO 表B (FLAG, DTFROM, DTFTO) SELECT (LAG(rep.FLAG) OVER (ORDER BY rep.DT) || rep.FLAG) AS FLAG, LAG(rep.DT) OVER (ORDER BY rep.DT) AS DTFROM, rep.DT AS DTFTO FROM 表A rep WHERE (LAG(rep.FLAG) OVER (ORDER BY rep.DT) || rep.FLAG) IN ('EE', 'HH');
场景2:数据库不支持WHERE子句使用窗口函数(如Oracle、MySQL 8.0之前)
用CTE(公共表表达式)先完成聚合计算,再过滤插入:
WITH aggregated_data AS ( SELECT (LAG(rep.FLAG) OVER (ORDER BY rep.DT) || rep.FLAG) AS FLAG, LAG(rep.DT) OVER (ORDER BY rep.DT) AS DTFROM, rep.DT AS DTFTO FROM 表A rep ) INSERT INTO 表B (FLAG, DTFROM, DTFTO) SELECT FLAG, DTFROM, DTFTO FROM aggregated_data WHERE FLAG IN ('EE', 'HH');
逻辑说明
- 聚合计算:通过
LAG()窗口函数获取当前行的上一行FLAG值,和当前行FLAG拼接成新的FLAG字段,同时获取上一行的日期作为DTFROM,当前行日期作为DTFTO。 - 过滤插入:只保留拼接后FLAG为
EE或HH的行,直接插入到表B对应的字段中。
这样就一次性完成了聚合、过滤和插入三个操作,不需要额外的中间步骤。
内容的提问来源于stack exchange,提问作者Hey StackExchange
相关产品推荐
相关产品推荐

