【问题标题】:Finding the difference between two values in the same column in MySQL在 MySQL 中查找同一列中两个值之间的差异
【发布时间】:2010-02-24 14:37:34
【问题描述】:

我有一个名为的简单表,其中包含 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 |
+----------+------+------+------------+

解决这个问题的最佳方法是什么?某种加入?子查询?

我想我的目标是基本上查询一次以获取then,再次查询以获取now,然后以某种方式最后将它们粘合在一起。

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

【问题讨论】:

  • 我知道你想要什么,我知道它可以做到。如果还没有回答,我回家后会在我的开发服务器上试一试。
  • 编辑了我的答案,因为我有一个可以测试它的服务器。
  • 谢谢,我试试看告诉你。

标签: mysql


【解决方案1】:

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

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 个子查询的结果,每个子查询都有自己的子查询,分别是该范围的第一个和最后一个记录。

我将integer 用于stock_idfloat 用于pricetimestamp 用于日期,因为其他数据类型可能存在问题(尤其是 MIN 和 MAX)。

【讨论】:

  • 我认为这不是很好的移植(我对 Oracle 的了解不够)。您的子查询返回最近的记录和最旧的记录(带有时间段)。但这因此只返回两条记录(不捆绑)。这可能只是我适应它的方式......
  • 我很确定这是一个正确的解决方案,但在我的 20,000+ 行表上,查询在超时之前永远不会完成。但这不是你的问题,而是我的问题。在较小的桌子上,它应该可以正常工作。
猜你喜欢
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多