【发布时间】:2017-01-04 10:16:48
【问题描述】:
我有一个很大的表,其中有一个字段ID,另一个字段为collection_time。我想为每个 ID 选择最新记录。不幸的是,(ID, collection_time) 时间的组合在我的数据中并不是唯一的。我只想要最大collection time 的记录之一。我尝试了两种解决方案,但没有一个对我有用:
首先:使用查询
SELECT * FROM
(SELECT *, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY collection_time) as rn
FROM mytable) where rn=1
这导致Resources exceeded 错误,我猜是因为查询中的ORDER BY。
第二 在表和最新时间之间使用连接:
(SELECT tab1.*
FROM mytable AS tab1
INNER JOIN EACH
(SELECT ID, MAX(collection_time) AS second_time
FROM mytable GROUP EACH BY ID) AS tab2
ON tab1.ID=tab2.ID AND tab1.collection_time=tab2.second_time)
这个解决方案对我不起作用,因为(ID, collection_time) 不是唯一的,所以在JOIN 结果中每个ID 会有多行。
我想知道是否有针对 resourcesExceeded 错误的解决方法,或者在我的情况下可以使用不同的查询?
【问题讨论】:
-
mytable表上有索引吗 -
你的意思不是我可以通过
row_number()做的吗?不,因为 BigQuery 不会创建索引,而且我在上传数据之前没有将此类字段附加到数据中。 -
哦,我明白了.. 你还有其他有这些
ID's的表吗?或者这些 ID 是在哪里生成的? -
@Prdp 我可以通过从该表中选择唯一 ID 来生成此类表。
标签: sql google-bigquery