这是我最喜欢的mysql黑客。
以下是模拟滞后函数的方法:
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
子句在这里很重要,就像它在常规语句中一样
窗口功能。
-
您可能还想使用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;
嵌套不是相互关联的,所以没有看上去那么糟糕(从计算上讲):)
如果你需要帮助,请告诉我。