MySQL更新字段A基于字段B与同一表中前一行的差异

时间:2016-03-10 13:57:43

标签: mysql

我需要根据匹配的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

1 个答案:

答案 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