具有不同日期

时间:2017-03-27 19:46:43

标签: oracle select dense-rank analytical

我必须写这个查询,它有点复杂。我希望有人可以提供帮助,因为我之前从这里得到了很多帮助。

说我有客户股票投资组合。以及公司代码清单和购买代码的日期。我的列表看起来像这样:

CYSL  1/16/2017
MCIG  4/1/2016
MSRT  9/13/2016
NTFU  1/16/2017
QNTM  10/30/2014
SIGWX 6/28/2014
TRMCX 6/25/2014
TRT2  4/19/2016

现在,为了让我计算一些YTD性能,我需要应用以下逻辑:

如果购买日期> 01/01/2017,我会在购买时使用自动收报机的收盘价。 如果购买日期< 2017年1月1日。我将在< = 12/31/2016上使用股票收盘价。

涉及2个表:1)投资组合表2)价格历史

我已经走到了这一步:

SELECT ticker, MIN(transaction_date) KEEP (DENSE_RANK FIRST ORDER BY transaction_date) transaction_date 
FROM customer_portfolios
WHERE portfolio_id = 954118
GROUP BY ticker;

这给了我上面的列表。现在,我迷失了如何加入上述逻辑,获得正确的约会,并追求适当的价格。

我希望我能正确解释这一点。

帮助会很棒,如果能帮助你,我可以解释一下,帮助我。

谢谢。

3 个答案:

答案 0 :(得分:0)

使用GREATEST2016-12-31或更晚的交易日期获取日期,然后加入价格历史记录表:

SELECT cp.ticker,
       cp.transaction_date,
       h.close_price
FROM   (
  SELECT ticker,
         GREATEST(
           DATE '2016-12-31',
           MIN(transaction_date) KEEP (
             DENSE_RANK FIRST
             ORDER BY transaction_date
           )
         ) AS transaction_date 
  FROM customer_portfolios
  WHERE portfolio_id = 954118
  GROUP BY ticker
) cp
INNER JOIN price_history h
ON (   cp.ticker = h.ticker
   AND cp.transaction_date BETWEEN h.start_date AND h.end_date )

或者如果价格历史记录每天有一行(而不是上面查询中的假定范围),则将最后一行替换为:

   AND cp.transaction_date = h.price_date )

答案 1 :(得分:0)

也许,我在这里遗漏了一些东西,但没有任何真实的样本数据,这是我能想到的最好的东西。下面是表格ddl,插入和查询以及结果图像。

=IF(ISNUMBER(MATCH(D2,A:A,0)),INDEX(I:I,MAX(IF($A$2:$A$23=D2,IFERROR(MATCH($B$2:$B$23,I:I,0),0)))),"Not Ordered")

enter image description here

答案 2 :(得分:-1)

此查询的最终目标是在购买时获得客户组合的总和。

这部分工作正常!

SELECT m_ticker,          GREATEST(            日期'2016-12-31',            MIN(transaction_date)KEEP(              DENSE_RANK第一              ORDER BY transaction_date            )          )AS transaction_date   来自customer_portfolio_history   WHERE portfolio_id = 954118   GROUP BY m_ticker;

提供我需要的数据:

CYSL 1/16/2017
MCIG 12/31/2016
MSRT 12/31/2016
NTFU 1/16/2017
QNTM 12/31/2016
SIGWX 12/31/2016
TRMCX 12/31/2016
TRT2 12/31/2016

现在变得更加棘手。根据上述结果,我需要进入PRICE_HISTORY,找到该日期或之前(最近)的价格。

所以,如果2016年12月31日没有条目(可能市场已经关闭),那么请尝试12 / 30,12 / 29等。同样的1/16/2017。如果没有条目,则尝试1/15,然后是1/14 ....

之后,我可以从PORTFOLIO表中获取该客户/投资组合/股票代码的总共#股票,并将其乘以我找到的当天的价格.....并且有价值。

非常疯狂,我知道。