Учитывая несколько строк с повторяющимися name
и разными timestamp
, я хотел бы выбрать строку с самым новым timestamp
, если дубликат name
возникает, скажем, в течение 45 минут после первого timestamp
.
Вот что работало в PostgreSQL:
SELECT i.ts AS base_timestamp, j.ts AS newer_timestamp, i.name
FROM tbl i
LEFT JOIN LATERAL
(SELECT j.ts
FROM tbl j
WHERE i.name = j.name
AND j.ts > i.ts
AND j.ts < (i.ts + INTERVAL '45 minutes')
) j ON TRUE
WHERE j.ts is NULL
Отличное объяснение LATERAL
здесь: https://heap.io/blog/engineering/postgresqls-powerful-new-join-type-lateral
LATERAL join похож на цикл SQL foreach, в котором PostgreSQL будет перебирать каждую строку в наборе результатов и оценивать подзапрос, используя эту строку в качестве параметра.
Это похоже на коррелированный подзапрос, но в соединении.
Затем я просто беру только те строки, для которых нет более новой отметки времени (WHERE j.ts is NULL
).
Как это сделать в BigQuery?
EDIT: я создал пример группировки PostgreSQL в SQLFiddle как указано в комментариях.
Вход:
('Duplication Example','2019-06-22 19:10:25'),
('Duplication Example','2019-06-22 23:58:31'),
('Duplication Example','2019-06-23 00:08:00')
Вывод (в средней строке удалена отметка 23:58:31):
base_timestamp newer_timestamp name
2019-06-22T19:10:25Z (null) Duplication Example
2019-06-23T00:08:00Z (null) Duplication Example
RANGE
medium.com/@ubethke/ - person Martin Burch   schedule 05.12.2019