我从投资网站获得了最大回撤的定义(感谢 Google!)。所以我认为我们需要计算图表中的最高点与其随后的最低点之间的百分比下降。
以下查询计算过去十二个月内甲骨文股票投资的最大回撤。它将investments
表格连接到自身,并使用别名来区分表格的版本(一个代表最高峰,一个代表最低谷)。这可能无法反映您精确的业务逻辑,但它显示了 Oracle 为您提供的 SQL 技术。
select round(((max_return-min_return)/max_return)*100, 2) as max_drawdown
from
( select max(t1.return_amt) as max_return
, min(t2.return_amt) as min_return
from investments t1
join investments t2
on ( t1.stock_id = 'ORCL'
and t2.stock_id = t1.stock_id
and t2.created_date > t1.created_date )
where t1.created_date >= add_months(sysdate, -12)
and t2.created_date >= add_months(sysdate, -12)
)
/
如果股票在窗口期间没有经历下跌,则此查询将返回零。它也不会检查随后的回升(据我了解,回撤应该是低谷的底部,只有在股票再次开始攀升时我们才能确定这一点)。
关于在家培训,我们可以为此目的从Oracle TechNet下载软件。如果带宽或磁盘空间有问题,请选择 Express Edition;它没有所有功能,但您可能暂时还不需要它们。Oracle 确实提供了免费的 IDE,SQL Developer。顾名思义,它主要面向开发人员,但它具有 DB Artisan 的许多面向 DBA 的特性。对于全面的数据库管理,Oracle 提供了Enterprise Manager。
编辑
在评论中 outis 建议
您可以t1.return_amt >
t2.return_amt
在连接中添加 a 作为次要优化
我认为它不太return_amt
可能被编入索引,所以我认为这样的条款不太可能对性能产生影响。它会做的是改变没有回撤的股票的行为。我提出的查询对于在时间窗口内连续增加的股票返回零。在这种情况下,附加过滤器将返回 NULL。哪个是更理想的结果是品味(或需求规范)的问题。