Разница между значениями в разных строках - PullRequest
2 голосов
/ 12 марта 2020

MariaDB версия 10.4.10.

У меня есть скрипт скребка, который каждый час выбирает данные запаса и вставляет их в базу данных MySQL. Структура базы данных похожа на эту:

stocks( time_fetched DATETIME, fetch_id INT, name VARCHAR, price INT )

И некоторые примеры данных:

**time_fetched          fetch_id        name        price**
2020-03-10 09:00:00     1               stock1      10
2020-03-10 09:00:00     1               stock2      15
2020-03-10 10:00:00     2               stock1      12
2020-03-10 10:00:00     2               stock2      20
2020-03-10 11:00:00     3               stock1      8
2020-03-10 11:00:00     3               stock2      18

Я хочу получить способ изменения цены для каждой акции, скажем, между акциями, выбранными в 09 С 00:00 до 10:00 или с 09:00 до 11:00. Примерно так (псевдокод):

SELECT *, DIFF( current_price, price_one_hour_ago) AS change_1h, DIFF( current_price, price_two_hours_ago) AS change_2h

Возможно ли сделать это напрямую в MySQL? Я использую сценарий PHP для отображения данных, поэтому мне, возможно, придется прибегнуть к этому в PHP.

1 Ответ

3 голосов
/ 12 марта 2020

Вы можете использовать CTE, чтобы сгенерировать цены с задержкой на 1 или 2 часа, а затем вычислить изменения, используя эти значения (потенциально используя COALESCE, чтобы NULL сделать значения 0):

WITH prices AS (
  SELECT time_fetched, name, price,
         LAG(price, 1) OVER(PARTITION BY name ORDER BY time_fetched) AS price_1h,
         LAG(price, 2) OVER(PARTITION BY name ORDER BY time_fetched) AS price_2h
  FROM stocks
)
SELECT time_fetched, name, price,
       COALESCE(price - price_1h, 0) AS change_1h,
       COALESCE(price - price_2h, 0) AS change_2h
FROM prices

Вывод:

time_fetched            name    price   change_1h   change_2h
2020-03-10 09:00:00     stock1  10      0           0
2020-03-10 10:00:00     stock1  12      2           0
2020-03-10 11:00:00     stock1  8       -4          -2
2020-03-10 09:00:00     stock2  15      0           0
2020-03-10 10:00:00     stock2  20      5           0
2020-03-10 11:00:00     stock2  18      -2          3

Демонстрация для dbfiddle , также показывающая результаты запроса без COALESCE.

...