Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 不同行中的值之间的差异_Mysql_Sql_Window Functions - Fatal编程技术网

Mysql 不同行中的值之间的差异

Mysql 不同行中的值之间的差异,mysql,sql,window-functions,Mysql,Sql,Window Functions,MariaDB版本10.4.10 我有一个stock scraper脚本,它每小时提取一次股票数据并将其插入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

MariaDB版本10.4.10

我有一个stock scraper脚本,它每小时提取一次股票数据并将其插入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和10:00之间,或者在09:00和11:00之间。类似这样的代码(伪代码):


是否可以直接在MySQL中执行此操作?我正在使用PHP脚本来显示数据,因此我可能不得不使用PHP来代替。

您可以使用
CTE
生成延迟1或2小时的价格,然后使用这些值计算更改(可能使用
COALESCE
NULL
值转换为
0
):

输出:

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

同时显示不带合并的查询结果

请向我们显示此示例数据的预期结果。另请参见:您在时间上有差距吗?如果是的话,你怎么处理?哇,太好了,谢谢。我以前从未使用过窗口功能,它们看起来非常有用。再次感谢@不用担心,我很高兴能帮上忙。窗口功能是一件伟大的事情;它们使编写此类查询变得更加容易。绝对值得做更多的研究。
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