mysql - 仍未解决 : how to calculate price change (using prices from DIFFERENT dates) in 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    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-142011-03- 之间每只股票的%返回看涨 16,按%返回 DESC、返回sp100_id%返回平均看涨度对它们进行排名>。我认为以下查询可以解决问题:

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

我做错了什么?

最佳答案

您必须在查询中使用GROUP BY:

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

如果没有 GROUP BY,它仅返回一个结果行,因为 AVG 将所有记录分组在一起。

我使用带有 ORDER BYLIMIT 1 的子查询修复了 return_pct 的计算。

文档:GROUP BY (Aggregate) Functions

SQLfiddle

关于mysql - 仍未解决 : how to calculate price change (using prices from DIFFERENT dates) in MySQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12063996/

相关文章:

mysql - 左连接条件

MYSQL:模式匹配

php - mysql_connect 连接生命周期

mysql - 将数据插入通过连接表连接的 2 个表中

mysql - 从没有关系的单独表中选择

mysql - 'R.movie_name' 中的未知列 'on clause' 用于与子查询的内连接

mysql - SQL for ids from same table with relation defined in another table

mysql - 在另一个表中引用 MySQL ENUM

Java: 无法使用 JDBC 访问远程 MySQL 数据库

php - 用于搜索用户 token (技能)的 SQL 查询