我有一张表: -
+-----+--------------+--------------+----------+--------------------+---------------+-----------------+
| id | CustomerName | VideoQuality | IsActive | BufferedTime | ElapsedTime | TotalBufferTime |
+-----+--------------+--------------+----------+--------------------+---------------+-----------------+
| 139 | HotStar | 180 | Yes | 10.367167126617211 | 30.000000000 | NULL |
| 140 | HotStar | 1300 | NULL | 5.43524230876729 | 34.000000000 | NULL |
| 141 | HotStar | 1300 | NULL | 5.671054515212042 | 38.000000000 | NULL |
| 142 | HotStar | 1300 | NULL | 5.045639532902047 | 41.000000000 | NULL |
| 143 | HotStar | 1300 | NULL | 5.455747718023355 | 44.000000000 | NULL |
| 144 | HotStar | 1300 | NULL | 5.691559924468107 | 49.000000000 | NULL |
我想计算BufferTime和ElapsedTime列,并将该输出插入TotalBufferTime列,但我想跳过BufferTime的第一行。 所以fisrt计算将是5.43 + 30.000秒计算将是5.67 + 34.00,依此类推。 我还有一个列IsActive,显示缓冲时间的第一行。
我想做这样的事情: -
update RequestInfo SET `TotalBufferTime` = BufferedTime + ElapsedTime;
我只想跳过列缓冲时间的第一行。
答案 0 :(得分:2)
假设您确定了一个字段id
来确定表中的行顺序,您可以使用相关子查询来获取上一行的BufferedTime
,如下所示:
SELECT t1.CustomerName, t1.VideoQuality, t1.IsActive, t1.BufferedTime,
t1.ElapsedTime,
(SELECT t2.BufferedTime
FROM mytable AS t2
WHERE t2.td > t1.id
ORDER BY id LIMIT 1) + t1.ElapsedTime AS TotalBufferTime
FROM mytable AS t1
WHERE IsActive IS NULL
修改强>
要UPDATE
,您可以使用以下查询:
SET @et = 0;
SET @ElapsedTime = NULL;
UPDATE RequestInfo
SET TotalBufferTime = CASE
WHEN (@et := @ElapsedTime) < 0 THEN NULL
WHEN @ElapsedTime := ElapsedTime THEN BufferedTime + @et
END
ORDER BY id;
这里的技巧是使用CASE
表达式,其中第一个WHEN
子句总是评估(因为它是第一个)但是从不< / em>是的。这种方式@et
变量初始化为@ElapsedTime
的值,即上一个记录的值。