php - 当没有可用数据时,填充 MySQL 记录集输出中的最后一个已知值

标签 php mysql

考虑以下三个表格:

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-122011-03-13 以及节假日期间(例如 2011-03-17 >),没有可用的定价信息。

我需要的是一个包含日期范围中每个日期的开盘收盘定价信息的列表 。每当 daterange 中的 _datestocks 中没有定价信息时,就必须填写最后已知的定价信息。

因此,对于 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(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 会快很多。

感谢任何帮助:-)

最佳答案

我尝试了一下,它似乎得到了你所需要的。

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/

相关文章:

php - 根据位置将 'points' 分配给数组,如何处理平局?

mysql - 编写一个查询来查找每个员工第一份工作的最后一天

mysql - MySQL 表名的数学运算

php - 如何使用 angular.js PHP 显示来自 mysql 的数据?

java - 重新启动应用程序后无法删除数据库对象

php - 在 PHP/MYSQL 中处理双重结果

c# - mysql中的存储过程

php:在表单提交时创建目录?

php - WHERE 语句 SQL 不起作用

mysql - MongoDB 相当于 MYSQL concat()