2010-02-24 4 views
2

У меня есть простая таблица называется, которая содержит цены на акции в MySQL:найти разницу между двумя значениями в одном столбце в 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, а затем как-то приклеить все вместе в конце.

Редактировать: Мне тоже нужно учитывать отрицательные изменения.

+0

Я знаю, чего вы хотите, и я знаю, что это можно сделать. Если на него не ответили, я отвечу на мой dev-сервер, когда вернусь домой. – Tarka

+0

Отредактировав мой ответ, теперь у меня есть сервер, на котором я могу проверить его. – Tarka

+0

Спасибо, я попробую и дам вам знать. –

ответ

6

Хорошо, вернулся домой и смог понять это.

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_id, float для price и timestamp на дату, поскольку могут возникнуть проблемы (в частности, с MIN и MAX) с другими типами данных.

+0

Я не думаю, что это хорошо переносится (я недостаточно знаю Oracle). Ваши подзапросы возвращают самую последнюю запись и самую старую запись (с периодом времени). Но это поэтому возвращает только две записи (которые не связаны). Это может быть так, как я его адаптировал, хотя ... – Amadiere

+0

Я уверен, что это правильное решение, но в моей таблице из 20 000 строк запрос никогда не завершается до того, как он истечет. На самом деле это не ваша проблема, это мое. На меньшем столе он должен работать нормально. –

Смежные вопросы