Oracle查询如何获取年份及annualized_return的首尾行结果
解答
完全可以获取你需要的两类结果,先修正你提供的SQL里两处会直接报错的笔误:
- 建表语句里2020年数据行末尾漏写
UNION ALL,不符合UNION拼接语法 - 查询语句里写的表名是
tbl,实际你创建的表名为t,执行会报表不存在错误
筛选实现方法
annualized_return是多步函数计算得到的浮点型结果,直接用等值判断容易因为浮点精度问题漏匹配,建议用差值范围做匹配,把窗口计算部分放在子查询里,外层加WHERE条件筛选即可,完整可运行代码如下:
SELECT * FROM ( SELECT YEARS, PERCENTAGE, ROUND( (EXP(SUM(LN(1 + PERCENTAGE/100)) OVER(ORDER BY Years)) - 1)*100, 2 ) AS ACCUMULATIVE, ROUND( POWER( EXP(SUM(LN(1 + PERCENTAGE/100)) OVER(ORDER BY Years)),1/COUNT(*) OVER (ORDER BY Years)) * 100 - 100,2 ) AS annualized_return FROM t ) calc_result WHERE YEARS = 2014 -- 筛选2014年的首行结果 OR ABS(annualized_return - 16.71) < 0.001; -- 兼容浮点精度,匹配年化收益16.71的记录
返回结果说明
执行后会得到2条符合要求的记录:
- 2014年的首行记录:当年PERCENTAGE为38.15,对应年化收益率和当年收益率一致
- 累计计算到对应年份的记录:四舍五入保留2位小数后年化收益率恰好为16.71
注意:不要直接写
annualized_return = 16.71做筛选,浮点数存储和计算存在微小精度误差,直接等值匹配大概率无法命中目标行。
内容的提问来源于stack exchange,提问作者user19427142
相关产品推荐
相关产品推荐

