0

考虑以下三个表:

daterange     stocks                               companies
-----------   ----------------------------------   ----------------
_date         stock_id  nyse_date   open   close   stock_id  name
-----------   ----------------------------------   ----------------
2011-03-11    1         2011-03-11  40.50  40.60   1         Alcoa
2011-03-12    1         2011-03-14  40.62  41.04   2         Apple
2011-03-13    1         2011-03-15  41.00  41.20   .           .
2011-03-14    1         2011-03-16  41.15  42.00   .           .
2011-03-15    1         2011-03-18  41.50  41.80   100       Xerox
2011-03-16
2011-03-17
2011-03-18

daterange包含 2011 年 3 月 11 日至 9 月 1 日之间的一组连续日期。在同一时期,stocks包含 100 只股票的价格openclose定价信息。股票/公司在companies.

在周末2011-03-122011-03-13节假日期间(例如2011-03-17),没有可用的定价信息。

我需要的是一个包含每个日期open的列表和close定价信息。每当有一个in中没有定价信息时,必须填写最后一个已知的定价信息。daterange_datedaterangestocks

因此,对于 Alcoa ( stock_id 1),在给定daterange日期的情况下,输出必须是(* = 取自最后一个已知值):

stock_id _date       open   close 
---------------------------------
1        2011-03-11  40.50  40.60
1        2011-03-12  40.50  40.60 *
1        2011-03-13  40.50  40.60 *
1        2011-03-14  40.62  41.04
1        2011-03-15  41.00  41.20
1        2011-03-16  41.15  42.00
1        2011-03-17  41.15  42.00 *
1        2011-03-18  41.50  41.80

...实际上紧随其后的是截至 9 月 1 日的所有日期,然后继续stock_id2(示例openclose未给出)

2        2011-03-11  10.11  10.15
2        2011-03-12  10.11  10.15 * 
2        2011-03-13  10.11  10.15 *
2        2011-03-14  10.20  10.24
.        .
.        .

这可以在MySQL中做到吗?或者,我可以使用 PHP 从 下载日期daterange并循环stocks,只要没有特定日期的条目就填写。但我猜 MySQL 会快很多。

任何帮助表示赞赏:-)

4

1 回答 1

1

我试过了,它似乎得到了你需要的东西。

SELECT DISTINCT 1 AS Stock_id, D._date, 
       (SELECT S2.Open From Stocks S2
        WHERE S2.Stock_id=1
          AND S2.nyse_date < DATE_ADD(D._date, INTERVAL 1 DAY) 
        ORDER BY S2.nyse_date DESC
        LIMIT 1) AS open,
       (SELECT S3.Close From Stocks S3
        WHERE S3.Stock_id=1
          AND S3.nyse_date < DATE_ADD(D._date, INTERVAL 1 DAY) 
        ORDER BY S3.nyse_date DESC
        LIMIT 1) AS close
FROM daterange D LEFT JOIN stocks S1 ON D._date=S1.nyse_date
ORDER BY D._date ;
于 2012-07-18T17:48:33.277 回答