【发布时间】:2015-07-24 15:17:33
【问题描述】:
我目前有这些表:
CREATE TABLE #SECURITY_TEMP (ID CHAR(30))
CREATE TABLE #SECURITY_TEMP_PRICE_HISTORY (ID CHAR(30), PRICEDATE DATE, PRICE FLOAT)
CREATE TABLE #SECURITY_POST (ID CHAR(30), SECPOS int)
INSERT INTO #SECURITY_TEMP (ID) VALUES ('APPL') ,('VOD'),('VOW3'), ('AAA')
INSERT INTO #SECURITY_TEMP_PRICE_HISTORY (ID,PRICEDATE, PRICE) VALUES
('APPL', '20150101',10.4), ('APPL', '20150116',15.4), ('APPL', '20150124',22.4),
('VOD', '20150101', 30.5), ('VOD', '20150116',16.5), ('VOD', '20150124',16.5),
('VOW3', '20150101', 45.5), ('VOW3', '20150116',48.8) ,('VOW3', '20150124',50.55),
('AAA', '20100118', 0.002)
INSERT INTO #SECURITY_POST (ID,SECPOS) VALUES ('APPL', 100), ('VOD', 350), ('VOW3', 400)
我想要一个干净的表格,显示证券 ID、证券头寸和该证券在某个日期过后的最新可用价格。
现在当我执行以下操作时:
SELECT sec.ID, sec.SECPOS, t.PRICE
FROM #SECURITY_POST as SEC INNER JOIN #SECURITY_TEMP_PRICE_HISTORY as t
ON sec.ID = t.ID
WHERE t.PriceDate = '20150101'
GROUP BY sec.ID, secPos, t.price
我得到了正确的结果
1. ID SECPOS PRICE
2. APPL 100 10.4
3. VOD 350 30.5
4. VOW3 400 45.5
但是,在个别情况下,股票的价格可能不可用。因此,从这个意义上说,我希望能够获得最新的可用价格。
在做
SELECT sec.ID, sec.SECPOS, t.PRICE
FROM #SECURITY_POST as SEC INNER JOIN
#SECURITY_TEMP_PRICE_HISTORY as t
ON sec.ID = t.ID
WHERE t.PriceDate = '20150117'
GROUP BY sec.ID, secPos, t.price
因为没有数据而返回0行,并且正在做
SELECT sec.ID, sec.SECPOS, t.PRICE
FROM #SECURITY_POST as SEC INNER JOIN
#SECURITY_TEMP_PRICE_HISTORY as t
ON sec.ID = t.ID
WHERE t.PriceDate <= '20150117'
GROUP BY sec.ID, sec.secPos, t.price
HAVING sec.secpos <> 0
返回重复的行。
我尝试了很多不同的方法,但我无法获得我想要的输出。此外,我还希望能够获得价格最接近日期的一列(称为START_DATE)和价格最接近第二个日期的一列(称为END_DATE)和一列将成为Price@END_DATE - Price@START_DATE的位置。价格总是取自同一个#SECURITY_TEMP_PRICE_HISTORY。
但是,我的 SQL 知识令人尴尬,我想不出一个好的有效方法来做到这一点。任何帮助,将不胜感激。另请注意#SECURITY_PRICE_HISTORY table may contain more securities than the #SECURITY_POST 表。
【问题讨论】:
-
感谢大家清理我的帖子!
标签: sql sql-server sql-server-2012