0

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

假设我有一个客户股票投资组合。以及公司股票代码列表,以及股票代码的购买日期。我的列表看起来像这样:

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,我将使用购买时股票代码的收盘价。如果购买日期 < 01/01/2017。我将使用 <= 2016 年 12 月 31 日的收盘价。

涉及 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;

这给了我上面的列表。现在,我不知道如何将其与上述逻辑结合起来,以获得正确的日期,并追求正确的价格。

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

帮助会很大,如果对你有帮助,我可以解释更多,帮助我。

谢谢你。

4

3 回答 3

0

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

  CREATE TABLE PRICE_HISTORY 
   (    PRICE_DATE DATE, 
    TICKER VARCHAR2(20 BYTE), 
    OPEN_PRICE NUMBER, 
    CLOSE_PRICE NUMBER
   )

 CREATE TABLE PORTFOLIO_TABLE 
   (    TICKER VARCHAR2(20 BYTE), 
    TICKER_DATE VARCHAR2(20 BYTE), 
    CUSTOMER VARCHAR2(20 BYTE)
   ) 

Insert into PORTFOLIO_TABLE (TICKER,TICKER_DATE,CUSTOMER) values ('CYSL','1/16/2018','1');
Insert into PORTFOLIO_TABLE (TICKER,TICKER_DATE,CUSTOMER) values ('MCIG','04/1/2016','2');
Insert into PORTFOLIO_TABLE (TICKER,TICKER_DATE,CUSTOMER) values ('MSRT','09/13/2016','3');
Insert into PORTFOLIO_TABLE (TICKER,TICKER_DATE,CUSTOMER) values ('NTFU','01/16/2017','4');


Insert into PRICE_HISTORY (PRICE_DATE,TICKER,OPEN_PRICE,CLOSE_PRICE) values (to_date('27-MAR-2017 20:27:12','DD-MON-RRRR HH24:MI:SS'),'CYSL',1,2);
Insert into PRICE_HISTORY (PRICE_DATE,TICKER,OPEN_PRICE,CLOSE_PRICE) values (to_date('16-JUN-1997 20:27:33','DD-MON-RRRR HH24:MI:SS'),'MCIG',1,2);
Insert into PRICE_HISTORY (PRICE_DATE,TICKER,OPEN_PRICE,CLOSE_PRICE) values (to_date('31-MAY-2011 20:27:45','DD-MON-RRRR HH24:MI:SS'),'MSRT',5,8);
Insert into PRICE_HISTORY (PRICE_DATE,TICKER,OPEN_PRICE,CLOSE_PRICE) values (to_date('25-JAN-2021 20:27:55','DD-MON-RRRR HH24:MI:SS'),'NTFU',7,6);


WITH portfolio AS
  ( SELECT TICKER , TICKER_DATE, CUSTOMER FROM PORTFOLIO_TABLE
  )
SELECT
  CASE
    WHEN PRICE_DATE > '01-JAN-17'
    THEN CLOSE_PRICE
    ELSE OPEN_PRICE
  END AS AMOUNT,
  PRICE_DATE,
  P.TICKER,
  OPEN_PRICE,
  CLOSE_PRICE
FROM PRICE_HISTORY H,
  PORTFOLIO P
WHERE H.TICKER = P.TICKER;

在此处输入图像描述

于 2017-03-27T20:44:06.840 回答
0

用于GREATEST获取任2016-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 )
于 2017-03-27T20:22:39.637 回答
-1

此查询的最终目标是获得客户投资组合的总和,关于他的购买。

这部分工作完美!

SELECT m_ticker, GREATEST( DATE '2016-12-31', MIN(transaction_date) 保持 (DENSE_RANK FIRST ORDER BY transaction_date) ) AS transaction_date FROM customer_portfolio_history WHERE investment_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 等。2017 年 1 月 16 日也是如此。如果没有条目,则尝试 1/15,然后 1/14....

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

很疯狂,我知道。

于 2017-03-27T21:53:55.933 回答