Я нашел решение вашей проблемы. Я сделал следующее, сначала запустив
SELECT max(delta/60) as max_a FROM `<projectid>.<dataset>.<table>`
, чтобы вычислить максимальное количество шагов. Затем выполните следующую команду l oop
DECLARE a INT64 DEFAULT 1;
WHILE a <= 2 DO --2=max_a (change accordingly)
INSERT INTO `<projectid>.<dataset>.<table>` (id,time,delta)
SELECT id+1,TIMESTAMP_ADD(time, INTERVAL a MINUTE),delta-60*a
FROM
(SELECT id,time,delta
FROM `<projectid>.<dataset>.<table>`
)
WHERE delta > 60*a;
SET a = a + 1;
END WHILE;
Конечно, это недостаточно эффективно, но оно выполняет работу. Идентификаторы и дельты не заканчиваются sh на правильных значениях, они не должны быть необходимы. Все дельты заканчиваются на 60 (столбец может быть удален), и идентификаторы могут быть воссозданы с использованием временной метки, чтобы упорядочить их.
Вы можете попробовать использовать условное выражение в здесь , чтобы избежать l oop и проходить таблицу только один раз.
Я попытался
INSERT INTO `wave30-webhelp-rmir.testing.spliting` (id,time,delta)
SELECT id+1, CASE
WHEN delta>80 THEN TIMESTAMP_ADD(time, INTERVAL 1 MINUTE)
WHEN delta>150 THEN TIMESTAMP_ADD(time, INTERVAL 2 MINUTE)
END
,60
FROM
(SELECT id,time,delta
FROM `wave30-webhelp-rmir.testing.spliting`
)
WHERE delta > 60;
, но потерпел неудачу, потому что возвращает только первое условие, когда когда True. Так что я не уверен, возможно ли сделать все это сразу. Если у вас есть маленькие столы, я бы остановился на первом, который отлично работает.