仍然没有解决:如何计算MySQL中的价格变化(使用不同日期的价格)?

仍然没有解决:如何计算MySQL中的价格变化(使用不同日期的价格)?,mysql,Mysql,考虑下表: sp100_id _date open close bullishness ----------------------------------------------- 1 2011-03-14 100 110 2.23 1 2011-03-15 115 100 1.00 1 2011-03-16 110 110 0.85 2 2011-03-14 9

考虑下表:

sp100_id  _date        open  close  bullishness
-----------------------------------------------
1         2011-03-14   100   110    2.23
1         2011-03-15   115   100    1.00
1         2011-03-16   110   110    0.85
2         2011-03-14    90    85    0.99
2         2011-03-15    95    90    0.30
2         2011-03-16    92   100    4.66
3         2011-03-14   200   220    1.50
3         2011-03-15   250   210    1.75
3         2011-03-16   200   150    0.80
我想计算
2011-03-14
2011-03-16
之间每只股票的
%return
多头性
,按
%return
DESC和
平均多头性
对它们进行排序。我认为下面的查询可以做到这一点:

SELECT 
  sp100_id, 
  AVG(bullishness) as bullishness, 
  ((`close`-`open`) / `open`) as return_pct   
FROM
  stocks 
WHERE _date = BETWEEN '2011-03-14' AND '2011-03-16' 
ORDER BY return_pct DESC
然而,它似乎总是只返回一行。然而,预期产出是:

sp100_id return_pct                average bullishness
-----------------------------------------------------------
3        (150-200)/200 = -0.250   (1.50+1.75+0.80)/3 = 4.05
2        (100-90)/90   =  0.110   (0.99+0.30+4.66)/3 = 1.98
1        (110-100)/100 =  0.100   (2.23+1.00+0.85)/3 = 4.08

我做错了什么?

您必须在查询中使用
groupby

SELECT 
  sp100_id, 
  AVG(bullishness) as bullishness, 
  (((SELECT `close` FROM stocks s2
   WHERE s2.sp100_id=s1.sp100_id ORDER BY _date DESC LIMIT 1)
    -(SELECT `open` FROM stocks s3
   WHERE s3.sp100_id=s1.sp100_id ORDER BY _date ASC LIMIT 1)) / 
     (SELECT `open` FROM stocks s3
   WHERE s3.sp100_id=s1.sp100_id ORDER BY _date ASC LIMIT 1)) as return_pct
FROM
  stocks s1
WHERE _date BETWEEN '2011-03-14' AND '2011-03-16' 
GROUP BY sp100_id
ORDER BY return_pct DESC
如果不使用
groupby
,它只返回一个结果行,因为
AVG
将所有记录分组在一起

我使用带有
orderby
LIMIT 1
的子查询修复了return\u pct的计算

文件:


如果您使用
分组方式1是否有效?谢谢您的回复。我已尝试运行您的查询以查看输出是什么,但它没有在SQLFiddle:上运行。其次,您确定它输出正确的
返回值\u pct
?在我的查询中,它仅通过使用
2011-03-16
中的
open
close
值来计算
return\u pct
,但我看到您正在使用
SUM
做一些事情,这可能会解决这个问题?我删除了
=
之间的
之前的
符号,它修复了语法错误,现在运行正常。看到这一点,它仍然不能像预期的那样工作。查询应采用第一个日期(
2011-03-14
)的
open
价格和第二个日期(
2011-03-16
)的
close
价格。我已将公司3 2011-03-16的SQLFIDLE
close
价格更改为
150
()。现在,查询应该返回
(150-200)/200=-0.25
,但它返回
0.1
,因为
MIN/MAX
使其计算
(220-200)/200
。有什么想法吗?我总是需要第一个日期的
open
价格和第二个日期的
close
价格来执行计算。谢谢你到目前为止的帮助,顺便说一句:-)根据你评论中的解释,我终于明白了需要做哪些计算。我再次更新了我的答案并添加了SQLfiddle。这几乎有效,谢谢。但是,当我将'2011-03-14'和'2011-03-16'之间的
更改为'2011-03-14'和'2011-03-15'之间的
(因此在14号和15号之间)时,查询仍然会从16号开始取
关闭
值,我不明白为什么。请参见此处:请注意,当您将结束日期从
2011-03-16
更改为
2011-03-15
时,只有
bullsihness
值会更改。知道哪里出了问题吗?