Как я могу ссылаться на значения столбцов из предыдущих строк в BigQuery SQL, чтобы выполнять операции или вычисления? - PullRequest
0 голосов
/ 16 февраля 2019

Я отсортировал свои данные по времени начала, и я хочу создать новое поле, которое объединяет данные, которые перекрывают время начала из времени начала и окончания предыдущих строк.

Более конкретно, я хочу написатьлогика в том, что для данной записи X, если время начала находится где-то между временем начала и окончания предыдущей строки, я хочу присвоить записи X то же значение для нового поля, что и в предыдущей строке.Если время начала наступит после времени окончания предыдущей строки, оно получит новое значение для нового поля.

Возможно ли что-то подобное в BigQuery SQL?Думал, может быть, отставание или оконная функция, но не совсем уверен.Ниже приведены примеры того, как выглядит базовая таблица и что я хочу для финального стола.

Original Table

Desired Output Table

Любое понимание приветствуется!

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT recordID, startTime, endTime,
  COUNTIF(newRange) OVER(ORDER BY startTime) AS newRecordID
FROM (
  SELECT *, 
    startTime >= MAX(endTime) OVER(ORDER BY startTime ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS newRange
  FROM `project.dataset.table`
)

Вы можете протестировать, поиграть с выше, используя примеры данных из вашего вопроса, как в примере ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 recordID, TIME '12:35:00' startTime, TIME '12:50:00' endTime UNION ALL
  SELECT 2, '12:46:00', '12:59:00' UNION ALL
  SELECT 3, '14:27:00', '16:05:00' UNION ALL
  SELECT 4, '15:48:00', '16:35:00' UNION ALL
  SELECT 5, '16:18:00', '17:04:00' 
)
SELECT recordID, startTime, endTime,
  COUNTIF(newRange) OVER(ORDER BY startTime) AS newRecordID
FROM (
  SELECT *, 
    startTime >= MAX(endTime) OVER(ORDER BY startTime ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS newRange
  FROM `project.dataset.table`
)
-- ORDER BY startTime

с результатом

Row recordID    startTime   endTime     newRecordID  
1   1           12:35:00    12:50:00    0    
2   2           12:46:00    12:59:00    0    
3   3           14:27:00    16:05:00    1    
4   4           15:48:00    16:35:00    1    
5   5           16:18:00    17:04:00    1    
0 голосов
/ 16 февраля 2019

Это проблема пробелов и островков.Что вы хотите сделать, это назначить идентификатор группы непересекающимся группам.Вы можете вычислить непересекающиеся области с помощью оконных функций.

Запись начинает новую группу, если совокупное максимальное значение времени окончания, упорядоченное по времени начала и завершающему в предыдущей записи, меньше, чем текущее завершениевремя.Остальное - просто накопительная сумма для назначения идентификатора группы.

Для ваших данных:

select t.*,
       sum(case when prev_endtime >= endtime then 0 else 1 end) over (order by starttime) as group_id
from (select t.*,
             max(endtime) over (order by starttime rows between unbounded preceding and 1 preceding) as prev_endtime
      from t
     ) t;

Единственная потенциальная проблема - это если две записи начинаются в одно и то же время.Если это может произойти, возможно, логика должна быть несколько более сложной.

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