考虑以下三个表格:
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
包含open
和100 只股票的收盘
定价信息。股票/公司位于公司
中。
周末、2011-03-12
和 2011-03-13
以及节假日期间(例如 2011-03-17
>),没有可用的定价信息。
我需要的是一个包含日期范围
中每个日期的开盘
和收盘
定价信息的列表 。每当 daterange
中的 _date
在 stocks
中没有定价信息时,就必须填写最后已知的定价信息。
因此,对于 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_id
2(open
和 close
不是示例中给出)
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 会快很多。
感谢任何帮助:-)
最佳答案
我尝试了一下,它似乎得到了你所需要的。
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 ;
关于php - 当没有可用数据时,填充 MySQL 记录集输出中的最后一个已知值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11546848/