我需要根据匹配的pkid上一行的日期时间(字段B)计算持续时间(字段A)
datetime pkid Duration
01/03/2016 00:00:25 1
01/03/2016 00:01:02 2
01/03/2016 00:01:53 1 00:00:28
01/03/2016 00:04:56 1 00:03:03
01/03/2016 00:06:09 2 00:05:07
更新 - 我试图通过以下程序执行此操作,但这在语法
上失败DECLARE i int(5);
SET @i := 0;
WHILE @i<=27057 DO
SET @i:=@i+1;
SET @s := CONCAT('UPDATE tbl
SET Duration = TIMESTAMPDIFF(MINUTE,(SELECT MAX(Datetime) FROM tbl
WHERE pkid = (SELECT pkid FROM tbl WHERE id=',@i,') AND id<',@i,'),Datetime)
WHERE id=',@i,';');
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END WHILE;
我还尝试按照下面的说法分解语句,但在语句执行时会出现意外的语法错误NULL。调试后发现@jt没有正确设置。
BEGIN
DECLARE i int(5);
SET @i := 1;
WHILE @i<=195 DO
SET @i = @i + 1;
SET @it := ( SELECT Datetime FROM tbl WHERE id=@i );
SET @pkid := ( SELECT pkid FROM tbl WHERE id=@i );
SELECT MAX(Datetime) INTO @jt FROM tbl
WHERE pkid = @pkid AND id<@i;
SELECT @i, @it, @jt;
SET @s := CONCAT('UPDATE tbl
SET Duration = TIMESTAMPDIFF(MINUTE,',@jt,',',@it,')
WHERE id=',@i,';');
SELECT @s;
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END WHILE;
END
答案 0 :(得分:0)
BEGIN
DECLARE i int(5);
SET @i := 0;
WHILE @i <= 27170 DO
SET @i = @i + 1;
IF EXISTS (SELECT
Datetime
FROM tbl
WHERE ID = @i) THEN
SET @it := (SELECT
Datetime
FROM tbl
WHERE ID = @i);
SET @pkid := (SELECT
pkid
FROM tbl
WHERE ID = @i);
SELECT
MAX(Datetime) INTO @jt
FROM tbl
WHERE pkid = @pkid
AND ID < @i;
IF @jt IS NULL THEN
SET @jt = @it;
END IF;
SET @timestampdiff := TIMESTAMPDIFF(MINUTE, @jt, @it);
SET @s := CONCAT('UPDATE tbl
SET Duration = ', @timestampdiff, '
WHERE id=', @i, ';');
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END WHILE;
END