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