Oracle如何基于前序列值为查询结果集新增计算列?
实现方案
首先需要明确:之后所有行的判断依赖确定的排序规则,以下方案默认以你示例中第二列的序号字段(命名为seq_col)作为排序依据,第三列字段名为TEMREGIONAL,原表名为your_table,可根据实际字段名替换。
方案1:窗口函数实现(推荐)
利用Oracle窗口函数逐行统计当前行之前所有行的TEMREGIONAL最大值,只要之前出现过1,最大值就为1,否则为0:
SELECT col1, seq_col, TEMREGIONAL, NVL(MAX(TEMREGIONAL) OVER (ORDER BY seq_col ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), 0) AS new_col FROM your_table ORDER BY seq_col;
逻辑说明:
- 窗口范围是
排序后第一行到当前行的前一行,不会包含当前行本身,匹配你示例中TEMREGIONAL=1所在行的新增列仍为0的规则 - 首行之前没有数据,MAX返回NULL,用NVL转成0符合需求
方案2:先定位第一个1的位置再匹配
如果你的数据量不大,也可以先查询第一个TEMREGIONAL=1的位置,再逐行比较:
WITH first_1_pos AS ( -- 找不到1的话默认给一个极大值,保证所有行新增列都为0 SELECT NVL(MIN(seq_col), POWER(2, 31)) AS first_seq FROM your_table WHERE TEMREGIONAL = 1 ) SELECT t.col1, t.seq_col, t.TEMREGIONAL, CASE WHEN t.seq_col > f.first_seq THEN 1 ELSE 0 END AS new_col FROM your_table t CROSS JOIN first_1_pos f ORDER BY t.seq_col;
以上两种方案都可以完全匹配你给出的示例输入输出。
内容的提问来源于stack exchange,提问作者gravatasufoca
相关产品推荐
相关产品推荐

