我必须写这个查询,它有点复杂。我希望有人可以提供帮助,因为我之前从这里得到了很多帮助。
说我有客户股票投资组合。以及公司代码清单和购买代码的日期。我的列表看起来像这样:
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;
这给了我上面的列表。现在,我迷失了如何加入上述逻辑,获得正确的约会,并追求适当的价格。
我希望我能正确解释这一点。
帮助会很棒,如果能帮助你,我可以解释一下,帮助我。
谢谢。
答案 0 :(得分: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 )
答案 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")
答案 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表中获取该客户/投资组合/股票代码的总共#股票,并将其乘以我找到的当天的价格.....并且有价值。
非常疯狂,我知道。