PLSQL中如何在CASE语句中获取上月数据实现指定规则的标记计算
实现方案
逻辑说明
使用Oracle自带的LAG()分析函数获取同员工分组下、按年月排序的上一行value值,再结合CASE语句做判断即可。该方案天然支持跨年的月份衔接,不同员工的计算互不干扰。
直接查询获取结果
SELECT emp, year, month, value, CASE WHEN LAG(value, 1) OVER (PARTITION BY emp ORDER BY year, month) IS NULL OR LAG(value, 1) OVER (PARTITION BY emp ORDER BY year, month) = 0 THEN 'Y' ELSE 'N' END AS flag FROM 你的实际表名;
请把代码里的
你的实际表名替换为业务中对应的表名。
若需要给原表新增flag字段并批量更新
- 先新增存储标记的字段
ALTER TABLE 你的实际表名 ADD flag CHAR(1);
- 执行批量更新
MERGE INTO 你的实际表名 t USING ( SELECT emp, year, month, CASE WHEN LAG(value, 1) OVER (PARTITION BY emp ORDER BY year, month) IS NULL OR LAG(value, 1) OVER (PARTITION BY emp ORDER BY year, month) = 0 THEN 'Y' ELSE 'N' END AS calc_flag FROM 你的实际表名 ) s ON (t.emp = s.emp AND t.year = s.year AND t.month = s.month) WHEN MATCHED THEN UPDATE SET t.flag = s.calc_flag;
输出验证
执行后得到的结果和期望输出完全匹配:
| emp | year | month | value | flag |
|---|---|---|---|---|
| e1 | 2020 | 12 | 0.5 | Y |
| e1 | 2021 | 1 | 1 | N |
| e1 | 2021 | 2 | 0 | N |
| e1 | 2021 | 3 | 0.25 | Y |
内容的提问来源于stack exchange,提问作者Vin
相关产品推荐
相关产品推荐

