Разделить строку, содержащую данные за несколько дней, по отдельной дате (BigQuery)

#sql #group-by #google-bigquery #timestamp

#sql #группировка по #google-bigquery #временная метка

Вопрос:

У меня есть набор данных, содержащий информацию о событии определенного типа, включая starttime endtime , и duration (в минутах). Я хотел бы сгруппировать эти данные по date (будут извлечены из starttime ), но у меня есть строка, представляющая событие, которое происходит через несколько дней, например, index 33, starttime 2020-07-13 10:19:54 UTC, endtime 2020-07-15 13:13:21 UTC и duration 3053. Например, эта строка должна быть разбита на три строки:

 starttime          endtime            duration
2020-07-13 10:19   2020-07-13 23:59    821
2020-07-14 00:00   2020-07-14 23:59   1440
2020-07-15 00:00   2020-07-15 13:13    793
  

Чтобы было понятно, я пытаюсь использовать эти 3 строки для замены исходной строки, поэтому при группировании по date число будет правильным.

Скриншот набора данных

Как мне это сделать в BigQuery?

Ответ №1:

Используйте genereate_date_array() и unnest() :

 select t.ind,
       greatest(start_ts, timestamp(dt)) as start_ts,
       least(timestamp(date_add(dt, interval 1 day)), end_ts)
from (select 32 as ind, timestamp('2020-07-13 10:19:54 UTC') as start_ts,  timestamp('2020-07-13 13:13:21 UTC') as end_ts union all
      select 33 as ind, timestamp('2020-07-13 10:19:54 UTC') as start_ts,  timestamp('2020-07-15 13:13:21 UTC') as end_ts
     ) t cross join
     unnest(generate_date_array(date(start_ts), date(end_ts))) dt ;
  

Примечание: это дает конечную временную метку как полночь, а не за минуту или секунду до этого. Таким образом, промежуточные дни имеют 24 часа. Конечно, вы можете вычесть секунду или минуту, но мне это кажется менее точным.

Комментарии:

1. Именно то, что мне было нужно. Спасибо!