【发布时间】:2020-03-30 04:50:37
【问题描述】:
鉴于某些行具有重复的names 和不同的timestamps,我想选择具有最新timestamp 的行,如果重复的name 出现在第一个@ 的45 分钟内987654328@.
这是在 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 中执行此操作?
编辑:我已按照 cmets 的要求创建了 an example of the PostgreSQL grouping on 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/… -
请澄清-您是否对解决/解决帖子标题中的内容(这是非常通用和概念性的)或问题正文中第一句中的内容更感兴趣(更多实用且最有可能解决您的实际用例)?这是两个非常不同的东西 - 所以请澄清!
-
嗨@MikhailBerlyant,感谢您查看我的问题。我对解决问题主体第一句中所述的具体问题更感兴趣。如果答案以“不,BigQuery 没有 LATERAL,您需要使用 ... 来解决您的问题”开头,这将是最有用的。
-
这正是我所期望的——一旦有空,我会尽快回复你:o)
-
请添加一些输入数据和预期输出的简化示例。我试图阅读/分析您的案例,发现仍然不清楚您想要应用什么逻辑来产生结果。输入/输出的好例子肯定会有所帮助。一个名字就足够了,但请提供一些具有代表性的 ts(时间戳)
标签: google-bigquery lateral-join