这是我最喜欢的 MySQL hack。
这是您模拟滞后功能的方式:
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
来确保您正在计算相同的引号中的差异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;
嵌套并不相关,因此(计算上)不像看起来(语法上)那么糟糕:)
如果您需要任何帮助,请告诉我。