0

我想利用在两个表上进行内部连接的事实t1t2计算on t1.colum1>t2.colum2返回向量的最大回撤。问题是内部连接只能使用两个存储的数据库或表,我想只选择表的一部分。

还有其他可能性吗,我对 sql 完全陌生,找不到任何其他选择?

谢谢

编辑

在操作我的内部联接以便能够计算我的最大回撤之前,我必须能够在表格上的选择上而不是表格本身上进行内部联接。所以我听从了马克的建议,但我仍然遇到错误。这是我的查询:

select * 
from (select * from bars where rownum <= 10 as x)as tab1
inner join (select * from bars where rownum <= 10  as y) as tab2
on tab1.x=tab2.y

错误是 ora-00907 missing right parenthesis

  • 从 OP 的消息中提取的附加信息作为对这篇文章的回答发布。*
4

3 回答 3

7

您也可以在子选择上进行内部连接,您只需给子选择一个别名:

SELECT *
FROM (SELECT 1 AS X) AS T1
INNER JOIN (SELECT 1 AS Y) AS T2
ON T1.X = T2.Y

如果您发布非工作查询,我可以为您提供更适合您的确切表格的更好答案。

于 2009-12-21T00:06:46.627 回答
0

我从投资网站获得了最大回撤的定义(感谢 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。哪个是更理想的结果是品味(或需求规范)的问题。

于 2009-12-21T05:35:01.233 回答
0

(内部)连接不限于整个表。

于 2009-12-21T00:06:34.973 回答