这是我最喜欢的MySQL技巧。
这是模拟 lag 函数的方法:
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
保存当前行的引用值。
注意:
order by
子句在这里很重要,就像在常规窗口函数中一样。
- 您可能还想对
company
使用lag,以确保计算相同company
的引用差异。
- 您还可以以同样的方式实现行计数器,例如
@cnt:=@cnt+1
这个方案的好处是与其他方法(如使用聚合函数、存储过程或在应用程序服务器中处理数据)相比,计算非常简便。
编辑:
现在回到你提出的以所需格式获取结果的问题:
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;
嵌套并不相关,所以它在语法上看起来并不像它那么糟糕(计算上):)
如果需要任何帮助,请告诉我。