Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL根据另一个表中最近日期的价格计算值_Mysql_Date_Select_Join - Fatal编程技术网

MySQL根据另一个表中最近日期的价格计算值

MySQL根据另一个表中最近日期的价格计算值,mysql,date,select,join,Mysql,Date,Select,Join,我有两个表,我想在其中计算一个值。一个表提供历史价格的每日价格数据,而第二个表包含年度数据量,其中包含历史数据和预测数据。到目前为止,我可以将这两个表合并起来,这样我就可以通过每日表中相应日期的价格来计算历史年价值,但对于未来的年价值,我不想根据价格表中最后一个每日价格进行计算 当前表结构 Table 1: Prices (3 fields: date,code,price) Table 2: Volumes (3 fields: date,code,units) 当前查询 SELECT

我有两个表,我想在其中计算一个值。一个表提供历史价格的每日价格数据,而第二个表包含年度数据量,其中包含历史数据和预测数据。到目前为止,我可以将这两个表合并起来,这样我就可以通过每日表中相应日期的价格来计算历史年价值,但对于未来的年价值,我不想根据价格表中最后一个每日价格进行计算

当前表结构

Table 1: Prices   (3 fields: date,code,price)
Table 2: Volumes  (3 fields: date,code,units)
当前查询

SELECT v.date,p.price,v.units,CONCAT(p.price*v.units) AS Value
FROM Prices p,Volumes v
WHERE p.code = v.code AND p.date = v.date
AND v.code = 'X' AND (v.date BETWEEN '2012-12-31' AND '2016-12-31')
GROUP BY v.date
ORDER BY v.date
LIMIT 5;
2012-2013年数据而非2012-2016年数据的结果:

date   2012-12-31   2013-12-31 
price    50            58
units   100            90
Value  5000           5220
我的年度表卷有20142015年和2016年的卷估计,未显示,且每日表价格中的最后一个价格为65,但上述查询仅将卷与每日价格表中的相应日期值相匹配,而不使用最近的最后一个值。有人能告诉我怎么做最好吗

表示例注意:两个表都在“日期”和“代码”周围使用复合主键

date           code    units
2012-12-31     X        100
2012-12-31     Y         50
2013-12-31     X         90
2013-12-31     Y         45
2014-12-31     X         95
2014-12-31     Y         47
价格

date           code    price
2013-12-31     X         50
2013-12-31     Y         25
2014-01-01     X         58
2014-01-01     Y         27
2014-01-02     X         59
2014-01-02     Y         30
-----
2014-03-31     X         48
2014-03-31     Y         26
2014-04-01     X         49
2014-04-01     Y         27
last data point

如果您希望查询通过将未来预计单位数量乘以最近记录的价格来获取未来值,那么这就是查询。见工作

已根据OP请求更新查询。。工作 这一个计算与日期相关的价格。。一旦你到了未来的日期,它会用未来的单位来计算最后的价格

SELECT
  *,
  if(DATE(the_date) > NOW(), --- if its a future date put in last_price, else put in the current_price
    (future_units*last_price),
    (future_units*current_price))AS value
FROM(
  SELECT
    v.date AS the_date,
    v.units AS future_units,
    v.code,
    p.price AS current_price,
    (SELECT
       price
     FROM prices
     ORDER BY date DESC
     LIMIT 1) AS last_price
  FROM prices p
  LEFT JOIN volumes v ON p.code = v.code
  WHERE p.date >= v.date OR p.date < v.date
  AND DATE(v.date) BETWEEN '2012-12-31' AND '2016-12-31' -- DATE() used to cut out timestamp for accurate comparison
  GROUP BY v.date, v.code, v.units
)AS t

您可以发布一些示例数据或sql FIDLE吗?我不完全确定你的问题是什么。。您希望在2012年和2016年之间进行值计算吗?我不确定您的意思,但这两个表的日期字段类似,例如yyy-mm-dd,代码字段类似,例如X、Y、Z,它们都是每个表中的复合主键。“数量”表中的“单位”和“价格”表中的“价格”是整数。我的意思是,你能从两个表中发布5-10行数据,日期在你想要的日期范围之间吗?我想我不能在这里输入格式化的表,但“每日价格”表将包含每日历史日期数据,例如“2013-10-15”,2013-10-16’等,而在总量年度表中,日期数据将是年终数据,如‘2013-12-31’、‘2014-12-31’、‘2015-12-31’等。因此,我的上述查询可以通过它们在两个表中匹配的日期进行选择,但不能用于未来的年度数据,因为每日价格数据仅包含历史价格值。我需要的是从每日数据中获取最后一个可用价格,用于计算未来的年值。添加的表格示例。希望有点清楚,我想我需要了解一下这一点,因为我没有立即看到在哪里插入代码项的选择标准,例如选择“代码”或根据卷表选择的日期,例如“2012-12-31”和“2016-12-31”之间的日期。因此,如果你想要一个未来的日期,那么它将是一个大于今天的日期。这就是为什么我在v.date>中这样做的原因现在这个查询所做的是获取最后一个数据点的价格,并使用该价格乘以预测单位这是一个日期范围在2012年到2016年之间的样本-如果您查看插入到价格中的话。。最后一个记录是最新的,价格是27,这是你要求的,我需要的是从每日数据中获取最后一个可用价格,用于计算未来的年价值。好的,我知道你做了什么。您正在计算2012年12月31日至2016年12月31日年度期间每个v.单位的价值,从p.价格到当前价格的最后一个价格。不过,我所追求的是通过相应的价格(如2012-12-31和2013-12-31)对2012-12-31至2016-12-31期间进行估价,但对未来期间(如2014-12-31至2016-12-31)使用当前价格。在上述示例中,这意味着“2013-12-31”的X价格为50,而“2014-12-31”的价格为49;X的最后一个可用价格为'2014-04-01',最好将ID添加到此表中,因为没有ID要困难得多
SELECT
  *,
  if(DATE(the_date) > NOW(), --- if its a future date put in last_price, else put in the current_price
    (future_units*last_price),
    (future_units*current_price))AS value
FROM(
  SELECT
    v.date AS the_date,
    v.units AS future_units,
    v.code,
    p.price AS current_price,
    (SELECT
       price
     FROM prices
     ORDER BY date DESC
     LIMIT 1) AS last_price
  FROM prices p
  LEFT JOIN volumes v ON p.code = v.code
  WHERE p.date >= v.date OR p.date < v.date
  AND DATE(v.date) BETWEEN '2012-12-31' AND '2016-12-31' -- DATE() used to cut out timestamp for accurate comparison
  GROUP BY v.date, v.code, v.units
)AS t