我试图做一个连接查询来分析一些股票。在我的第一张名为top10perday的表中,我列出了我选择在第二天“买入”并在第二天卖出的10只股票:
date symbol
07-Aug-08 PM
07-Aug-08 HNZ
07-Aug-08 KFT
07-Aug-08 MET
...
08-Aug-08 WYE
08-Aug-08 XOM
08-Aug-08 SGP
08-Aug-08 JNJ例如,对于记录1:
。
我的股票价格在一个名为prices的表格中,如下所示:
date symbol price
07-Aug-08 PM 54.64
08-Aug-08 PM 55.21
11-Aug-08 PM 55.75
12-Aug-08 PM 55.95
... many more records with trading day, symbol, price我想做一个联接,以便我的结果集看起来如下:
date symbol price-next-day price-two-days
07-Aug-08 PM 55.21 55.75
...
list one record per date and symbol in table1.我试过这样做:
SELECT top10perday.date, top10perday.symbol, Min(prices.date) AS MinOfdate
FROM prices INNER JOIN top10perday ON prices.symbol = top10perday.symbol
GROUP BY top10perday.date, top10perday.symbol
HAVING (((Min(prices.date))>[date]));我尝试过许多不同的方法,但我显然不是在正确的路径上,因为结果集只包含了top10perday表中显示的最早日期的10行。
我正在使用Microsoft。谢谢你的帮助!:)
发布于 2009-08-19 14:50:24
这种语法在Access 2003中有效:
SELECT t10.Date, t10.Symbol, p1.date, p1.price, p2.date, p2.price
FROM
(top10perday AS t10
LEFT JOIN prices AS p1
ON t10.Symbol = p1.symbol)
INNER JOIN prices AS p2 ON t10.Symbol = p2.symbol
WHERE (
((p1.date)=((Select Min([date]) as md
from prices
where [date]>t10.[Date] and symbol = t10.symbol
))
) AND ((p2.date)=((Select Min([date]) as md
from prices
where [date]>p1.[Date] and symbol = t10.symbol)
))
);这样做的目的是获得比上表中的日期(top10perday和价格为p1)更大的第一个日期(最小日期)。
发布于 2009-08-19 00:49:16
我猜是:
SELECT top10perday.date, top10perday.symbol, MIN(pnd.price) AS PriceNextDay, MIN(ptd.price) AS PriceTwoDays
FROM top10perday
LEFT OUTER JOIN prices AS pnd ON (pnd.symbol = top10perday.symbol AND pnd.date > top10perday.date)
LEFT OUTER JOIN prices AS ptd ON (ptd.symbol = top10perday.symbol AND ptd.date > pnd.date)
GROUP BY top10perday.date, top10perday.symbol
HAVING ((pnd.date = Min(pnd.date) AND ptd.date = Min(ptd.date));这只是在黑暗中拍摄,但我的理由是:列出所有的股票你想要(top10perday),并得到的价格,如果有,在其日期后的最小日期填充PriceNextDay和价格与最小日期后的PriceNextDay填充PriceTwoDays。这场演出可能很糟糕。但是测试一下,看看它是否有效。以后我们可以试着改进它。
**EDIT**编辑包括罗布·法利的评论。
发布于 2009-08-19 00:51:55
这应该是三份价格表之间的联接。问题是,你需要加入到下一个交易日,这是一个稍微棘手的问题,因为它并不总是第二天。因此,我们最终会遇到一个更复杂的情况(特别是由于假期的缘故,有些日子被跳过了)。
如果没有访问,您可以使用row_number()按日期订购价格(使用每个股票代码的不同顺序)。
WITH OrderedPrices AS
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY symbol ORDER BY date) AS RowNum
FROM Prices
)
SELECT orig.*, next_day.price, two_days.price
FROM OrderedPrices orig
JOIN
OrderedPrices next_day
ON next_day.symbol = orig.symbol AND next_day.RowNum = orig.RowNum + 1
JOIN
OrderedPrices two_days
ON two_days.symbol = orig.symbol AND two_days.RowNum = orig.RowNum + 2
;但是您使用的是Access,所以我认为您没有ROW_NUMBER()。
相反,您可以有一个表,列出日期,有一个TradingDayNumber.然后用它来促进你的加入。
SELECT orig.*, next_day.price, two_days.price
FROM Prices orig
JOIN
TradingDays d0
ON d1.date = orig.date
JOIN
TradingDays d1
ON d1.TradingDayNum = d0.TradingDayNum + 1
JOIN
TradingDays d2
ON d2.TradingDayNum = d0.TradingDayNum + 2
JOIN
Prices next_day
ON next_day.symbol = orig.symbol AND next_day.date = d1.date
JOIN
Prices two_days
ON two_days.symbol = orig.symbol AND two_days.date = d2.date但显然您需要构造您的TradingDays表..。
抢夺
https://stackoverflow.com/questions/1297254
复制相似问题