首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >把两张桌子连接起来,得到明天的价格(从“现在”算起两天的价格)

把两张桌子连接起来,得到明天的价格(从“现在”算起两天的价格)
EN

Stack Overflow用户
提问于 2009-08-19 00:16:33
回答 4查看 480关注 0票数 0

我试图做一个连接查询来分析一些股票。在我的第一张名为top10perday的表中,我列出了我选择在第二天“买入”并在第二天卖出的10只股票:

代码语言:javascript
复制
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:

  • 记录的日期是07-8月-08
  • 我想在07-8月-08(08年8月-08)之后的下一个交易日购买PM股票,
  • 我想在07-8月-08之后的两个交易日出售那部分PM股票,结果是11-8月-08

我的股票价格在一个名为prices的表格中,如下所示:

代码语言:javascript
复制
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

我想做一个联接,以便我的结果集看起来如下:

代码语言:javascript
复制
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.

我试过这样做:

代码语言:javascript
复制
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。谢谢你的帮助!:)

EN

回答 4

Stack Overflow用户

发布于 2009-08-19 14:50:24

这种语法在Access 2003中有效:

代码语言:javascript
复制
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)更大的第一个日期(最小日期)。

票数 2
EN

Stack Overflow用户

发布于 2009-08-19 00:49:16

我猜是:

代码语言:javascript
复制
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**编辑包括罗布·法利的评论。

票数 1
EN

Stack Overflow用户

发布于 2009-08-19 00:51:55

这应该是三份价格表之间的联接。问题是,你需要加入到下一个交易日,这是一个稍微棘手的问题,因为它并不总是第二天。因此,我们最终会遇到一个更复杂的情况(特别是由于假期的缘故,有些日子被跳过了)。

如果没有访问,您可以使用row_number()按日期订购价格(使用每个股票代码的不同顺序)。

代码语言:javascript
复制
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.然后用它来促进你的加入。

代码语言:javascript
复制
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表..。

抢夺

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1297254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档