Преобразование одной строки в несколько строк Bigquery SQL - PullRequest
0 голосов
/ 07 апреля 2020

Преобразование строки в несколько строк в bigQuery SQL. Количество строк зависит от конкретного значения столбца (в данном случае это значение delta_unit / 60):

Исходная таблица:

ID             time                           delta_unit
101            2019-06-18 01:00:00            60
102            2019-06-18 01:01:00            60
103            2019-06-18 01:03:00            120

ID 102 записал время в 01 : 01: 00 и следующая запись была в 01:03:00. Итак, нам не хватает записи, которая должна была быть 01:02:00 и delta_unit = 60

Ожидаемая таблица:

ID             time                           delta_unit
101            2019-06-18 01:00:00            60
102            2019-06-18 01:01:00            60
104            2019-06-18 01:02:00            60
103            2019-06-18 01:03:00            60

Новая строка создается на основе delta_unit. Количество строк, которые необходимо создать, будет зависеть от значения delta_unit / 60 (в данном случае 120/60 = 2)

1 Ответ

0 голосов
/ 07 апреля 2020

Я нашел решение вашей проблемы. Я сделал следующее, сначала запустив

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. Так что я не уверен, возможно ли сделать все это сразу. Если у вас есть маленькие столы, я бы остановился на первом, который отлично работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...