在MySQL中查找同一列中两个值之间的差异

在MySQL中查找同一列中两个值之间的差异,mysql,Mysql,我有一个名为的简单表,其中包含MySQL中的股价: Table `share_prices` +----------+-------+---------------------+ | stock_id | price | date | +----------+-------+---------------------+ | 1 | 0.05 | 2010-02-24 01:00:00 | | 2 | 3.25 | 2

我有一个名为的简单表,其中包含MySQL中的股价:

Table `share_prices`

+----------+-------+---------------------+
| stock_id | price | date                |    
+----------+-------+---------------------+    
|        1 |  0.05 | 2010-02-24 01:00:00 |
|        2 |  3.25 | 2010-02-24 01:00:00 |
|        3 |  3.30 | 2010-02-24 01:00:00 |
|        1 |  0.50 | 2010-02-23 23:00:00 |
|        2 |  1.90 | 2010-02-23 23:00:00 | 
|        3 |  2.10 | 2010-02-23 23:00:00 |
|        1 |  1.00 | 2010-02-23 19:00:00 |
|        2 |  1.00 | 2010-02-23 19:00:00 | 
|        3 |  1.00 | 2010-02-23 19:00:00 | 
+----------+-------+---------------------+
每次更新股价时,都会在表中插入一个新行

使用此结构,如何返回显示过去24小时内价格变化的查询?

预期的结果将是:

+----------+------+------+------------+
| stock_id | then | now  | difference |
+----------+------+------+------------+    
|        3 | 1.00 | 3.30 |       2.30 |
|        2 | 1.00 | 3.25 |       2.25 |
|        1 | 1.00 | 0.05 |      -0.95 |
+----------+------+------+------------+
最好的办法是什么?某种形式的加入?子查询

我想我的目标是本质上查询一次以获取
然后
,再次查询以获取
现在
,然后以某种方式将其粘合在一起


编辑:我也需要考虑负面的变化。

好的,回到家,并且能够解决这个问题

SELECT stock_id, t1.price AS `then`, t2.price AS `now`, ROUND(t2.price - t1.price, 2) AS `difference`
FROM (
        SELECT stock_id, price, date FROM share_prices sp
        WHERE  date = (SELECT MIN(date) FROM share_prices sp2
                       WHERE date BETWEEN '2010/02/23 10:00:00'
                       AND '2010/02/24 10:00:00'
                       AND sp2.stock_id = sp.stock_id)
    ) t1
    JOIN
    (
        SELECT stock_id, price, date FROM share_prices sp
        WHERE  date = (SELECT MAX(date) FROM share_prices sp2
                       WHERE date BETWEEN '2010/02/23 10:00:00'
                       AND '2010/02/24 10:00:00'
                       AND sp2.stock_id = sp.stock_id)
    ) t2 USING(stock_id)
ORDER BY `difference` DESC
使用2个子查询的结果,每个子查询都有各自的子查询,分别指向该范围的第一个和最后一个记录


我对
股票id
使用了
整数
浮动
用于
价格
时间戳
用于日期,因为其他数据类型可能会有问题(特别是最小值和最大值)。

我认为移植不好(我对Oracle了解不够)。子查询将返回最新记录和最旧记录(带有时间段)。但这因此只返回两条记录(它们没有关联)。这可能就是我调整它的方式……我很确定这是一个正确的解决方案,但在我的20000多行表上,查询永远不会在超时之前完成。这不是你的问题,是我的问题。在一张小一点的桌子上,它应该很好用。我知道你想要什么,我知道这是可以做到的。如果还没有回答,我会在回家后在我的开发服务器上试用。现在我有了一台服务器可以测试我的答案。谢谢,我会试用并让你知道。