给定一些具有重复name
s 和不同s 的行,如果重复出现在第一个 45 分钟内timestamp
,我想选择最新的行。timestamp
name
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 中执行此操作?
编辑:我已经按照评论中的要求在SQLFiddle 上创建了一个 PostgreSQL 分组示例。
输入:
('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