Simulate lag function in MySQL(模拟 MySQL 中的滞后函数)
问题描述
| time | company | quote |
+---------------------+---------+-------+
| 0000-00-00 00:00:00 | GOOGLE | 40 |
| 2012-07-02 21:28:05 | GOOGLE | 60 |
| 2012-07-02 21:28:51 | SAP | 60 |
| 2012-07-02 21:29:05 | SAP | 20 |
我如何在 MySQL 中对这个表做滞后以打印引号中的差异,例如:
How do I do a lag on this table in MySQL to print the difference in quotes, for example:
GOOGLE | 20
SAP | 40
推荐答案
这是我最喜欢的 MySQL hack.
This is my favorite MySQL hack.
这是模拟滞后函数的方式:
This is how you emulate the lag function:
SET @quot=-1;
select time,company,@quot lag_quote, @quot:=quote curr_quote
from stocks order by company,time;
lag_quote
保存前一行引用的值.对于第一行,@quot 是 -1.curr_quote
保存当前行的引用值.lag_quote
holds the value of previous row's quote. For the first row @quot is -1.curr_quote
holds the value of current row's quote.order by
子句在这里很重要,就像在常规中一样窗函数.- 您可能还想对
company
使用滞后,以确保您计算的是同一company
的引号中的差异. - 你也可以用同样的方式实现行计数器
@cnt:=@cnt+1
order by
clause is important here just like it is in a regular window function.- You might also want to use lag for
company
just to be sure that you are computing difference in quotes of the samecompany
. - You can also implement row counters in the same way
@cnt:=@cnt+1
注意事项:
与使用聚合函数、存储过程或在应用服务器中处理数据等其他一些方法相比,这种方案的优点是计算量非常小.
The nice thing about this scheme is that is computationally very lean compared to some other approaches like using aggregate functions, stored procedures or processing data in application server.
现在来解决以您提到的格式获取结果的问题:
Now coming to your question of getting result in the format you mentioned:
SET @quot=0,@latest=0,company='';
select B.* from (
select A.time,A.change,IF(@comp<>A.company,1,0) as LATEST,@comp:=A.company as company from (
select time,company,quote-@quot as change, @quot:=quote curr_quote
from stocks order by company,time) A
order by company,time desc) B where B.LATEST=1;
嵌套是不相关的,所以没有它看起来(语法上)那么糟糕(计算上):)
The nesting is not co-related so not as bad (computationally) as it looks (syntactically) :)
如果您需要任何帮助,请告诉我.
Let me know if you need any help with this.
这篇关于模拟 MySQL 中的滞后函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:模拟 MySQL 中的滞后函数
- 如何将 SonarQube 6.7 从 MySQL 迁移到 postgresql 2022-01-01
- 远程 mySQL 连接抛出“无法使用旧的不安全身份验证连接到 MySQL 4.1+"来自 XAMPP 的错误 2022-01-01
- 如何将 Byte[] 插入 SQL Server VARBINARY 列 2021-01-01
- SQL 临时表问题 2022-01-01
- 在SQL中,如何为每个组选择前2行 2021-01-01
- 导入具有可变标题的 Excel 文件 2021-01-01
- 更改自动增量起始编号? 2021-01-01
- 使用 Oracle PL/SQL developer 生成测试数据 2021-01-01
- 以一个值为轴心,但将一行上的数据按另一行分组? 2022-01-01
- 如何使用 pip 安装 Python MySQLdb 模块? 2021-01-01