【发布时间】:2017-07-06 19:46:42
【问题描述】:
昨天有人问interesting question,需要使用 LAG 更新 MySQL 表。考虑以下输入表(左)和所需的输出(右):
**INPUT** **OUTPUT**
ID TestDate PerformanceStatus (PS) ID TestDate PS PreviousPerformanceStatus
1 15/03/2016 0 1 15/03/2016 0 0
1 01/04/2016 2 1 01/04/2016 2 0
1 05/05/2016 1 1 05/05/2016 1 2
1 07/06/2016 1 1 07/06/2016 1 1
2 15/03/2016 0 2 15/03/2016 0 1
2 01/04/2016 2 2 01/04/2016 2 0
2 05/05/2016 1 2 05/05/2016 1 2
2 07/06/2016 3 2 07/06/2016 3 1
2 23/08/2016 1 2 23/08/2016 1 3
换句话说,目标是将之前记录中存在的值分配给PreviousPerformanceStatus,按照ID然后TestDate的顺序排列。
@spencer7593 给出的公认答案使用了相关子查询。然而,我首先想到的是使用用户变量。以下是我的回答:
SET @lag = 0;
UPDATE yourTable
SET PreviousPerformanceStatus = @lag,
@lag:=PerformanceStatus
ORDER BY ID, TestDate
有人告诉我这个答案是不稳定的,但我想知道是否有人可以解释为什么可能会出错,在这种情况下会发生什么,最后我们可以做些什么来使用用户变量在这里模拟 LAG。
据我了解,以下SELECT 查询完全没有问题:
SELECT PerformanceStatus,
@lag AS PreviousPerformanceStatus,
@lag:=PerformanceStatus
FROM yourTable
ORDER BY ID, TestDate
但是,在执行UPDATE 时,还需要考虑其他因素。
【问题讨论】:
-
更新语句抛出 1064 错误,所以这个问题有点没有实际意义。
-
@P.Salmon 有什么办法可以解决这个错误吗?
-
错误开启,@lag:=PerformanceStatus,我认为您不能在更新语句中设置变量 - 所以不能。
-
@P.Salmon 如果您想将其发布为答案,我很乐意将其标记为正确。如果是这样,那么这将关闭尝试在更新时使用变量模拟 MySQL 中的分析函数。