Объединение диапазонов в SQL / BigQuery - PullRequest
0 голосов
/ 13 июня 2019

Я хочу объединить смежные диапазоны дат в BigQuery.

У меня есть такая таблица:

ID   START                     END
1    2019-01-18 17:34:58 UTC   2019-02-18 12:14:59 UTC
1    2019-02-18 06:04:39 UTC   2019-02-18 08:05:05 UTC
1    2019-02-18 08:05:05 UTC   2019-02-18 10:06:05 UTC
1    2019-02-18 10:06:05 UTC   2019-02-19 11:16:15 UTC
2    2019-01-19 06:02:29 UTC   2019-01-29 11:02:23 UTC

Поскольку три средние строки представляют один диапазон, разделенный на три части, яхочу объединить их так, чтобы таблица выглядела следующим образом:

ID   START                     END
1    2019-01-18 17:34:58 UTC   2019-02-18 12:14:59 UTC
1    2019-02-18 06:04:39 UTC   2019-02-19 11:16:15 UTC
2    2019-01-19 06:02:29 UTC   2019-01-29 11:02:23 UTC

Как лучше всего это сделать?

1 Ответ

1 голос
/ 13 июня 2019

Вам необходимо определить, где начинаются диапазоны. В вашем случае они, кажется, имеют точное совпадение конца и начала, поэтому вы можете использовать lag(), чтобы определить, где начинаются группы. Совокупное количество пусков обеспечивает идентификатор группировки, который можно использовать для агрегирования:

select id, min(start) as start, max(end) as end
from (select t.*, countif(prev_end is null or prev_end <> start) over (partition by id order by start) as grp
      from (select t.*, lag(end) over (partition by id order by start) as prev_end
            from t
           ) t
     ) t
group by id, grp;

Если группы могут перекрываться, то кумулятивный максимум обычно делает свое дело:

select id, min(start) as start, max(end) as end
from (select t.*, countif(prev_end is null or prev_end <> start) over (partition by id order by start) as grp
      from (select t.*,
                   max(end) over (partition by id order by start rows between unbounded preceding and 1 preceding) as prev_end
            from t
           ) t
     ) t
group by id, grp;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...