仍然没有解决:如何计算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的SQLFIDLEclose
价格更改为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
值会更改。知道哪里出了问题吗?