基于timediff的不同行中值之间的差异

问题描述 投票:0回答:1

MariaDB版本10.4.10。

我有一个股票搜寻器脚本,该脚本每小时获取一次股票数据,并将其插入到MySQL数据库中。我想要一种获取每种股票之间的价格差异的方法,例如:

  • 在2020-03-25 07:00和2020-03-25 19:00(12小时)提取的股票
  • 在2020-03-25 07:00和2020-03-26 07:00(24小时)获取的股票
  • 在2020-03-25 08:00和2020-03-25 20:00(12小时)取货的股票
  • [库存分别于2020-03-25 08:00和2020-03-26 08:00(24小时)获取等

数据库结构看起来像这样:

stocks( time_fetched DATETIME, name VARCHAR, price INT )

一些示例数据:

**time_fetched          name        price**
2020-03-25 07:00:00     stock_A     10
2020-03-25 07:00:00     stock_B     14
2020-03-25 08:00:00     stock_A     12
2020-03-25 08:00:00     stock_B     20
...
2020-03-25 19:00:00     stock_A     28
2020-03-25 19:00:00     stock_B     32
2020-03-25 20:00:00     stock_A     40
2020-03-25 20:00:00     stock_B     36
...
2020-03-26 07:00:00     stock_A     12
2020-03-26 07:00:00     stock_B     16
2020-03-26 08:00:00     stock_A     18
2020-03-26 08:00:00     stock_B     16

预期结果:

**time_fetched            name        current_price     price_12h_ago     price_24h_ago**
2020-03-25 19:00:00     stock_A     28                10                NULL
2020-03-25 19:00:00     stock_B     32                14                NULL
2020-03-25 20:00:00     stock_A     40                12                NULL
2020-03-25 20:00:00     stock_B     36                20                NULL
2020-03-26 07:00:00     stock_A     12                28                10
2020-03-26 07:00:00     stock_B     16                32                14
2020-03-26 08:00:00     stock_A     18                40                12
2020-03-26 08:00:00     stock_B     16                36                20

当前,我正在使用与此类似的SQL:

WITH prices AS (
  SELECT time_fetched, name, price,
         LAG(price, 12) OVER(PARTITION BY name ORDER BY time_fetched) AS price_12h_ago,
         LAG(price, 24) OVER(PARTITION BY name ORDER BY time_fetched) AS price_24h_ago
  FROM stocks
)
SELECT time_fetched, name, price AS current_price, price_12h_ago, price_24h_ago
FROM prices

这是可行的,因为所有股票都已获取了所有小时的价格数据。 实际上,小时之间有时存在间隙,并且库存数据库中缺少某些小时的价格数据和某些库存。

这意味着上面的代码在当前行之前的12行获取价格,并不总是代表当前行之前12小时。

因此,我需要一种方法来根据实际的timediff获得价格差异。

希望这对外面的任何人都有意义:)

mysql sql mariadb window-functions
1个回答
0
投票

您可以使用range()子句。如果您的时间很准确:

SELECT time_fetched, name, price,
       MIN(price) OVER (PARTITION BY name
                        ORDER BY time_fetched
                        RANGE BETWEEN INTERVAL 12 hour AND INTERVAL 12 hour
                       ) as price_12h_ago,
       MIN(price) OVER (PARTITION BY name
                        ORDER BY time_fetched
                        RANGE BETWEEN INTERVAL 24 hour AND INTERVAL 24 hour
                       ) as price_24h_ago
FROM stocks;
© www.soinside.com 2019 - 2024. All rights reserved.