Mysql Query中不同列的计算

时间:2017-01-16 11:20:16

标签: mysql

我有一张表: -

+-----+--------------+--------------+----------+--------------------+---------------+-----------------+
| 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;

我只想跳过列缓冲时间的第一行。

1 个答案:

答案 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的值,即上一个记录的值。

Demo here