Sql BigQuery表中按ID显示的最新行的物化视图?
我有一个BigQuery表,具有~5k个唯一ID。每天都会为可能存在或可能不存在的ID插入新行 我们使用此查询查找最近的行:Sql BigQuery表中按ID显示的最新行的物化视图?,sql,google-cloud-platform,google-bigquery,materialized-views,Sql,Google Cloud Platform,Google Bigquery,Materialized Views,我有一个BigQuery表,具有~5k个唯一ID。每天都会为可能存在或可能不存在的ID插入新行 我们使用此查询查找最近的行: SELECT t.* EXCEPT (seqnum), FROM (SELECT t.*, ROW_NUMBER() OVER (PARTITION BY id ORDER BY date_of_data DESC ) a
SELECT t.*
EXCEPT (seqnum),
FROM (SELECT t.*,
ROW_NUMBER() OVER (PARTITION BY id
ORDER BY date_of_data DESC
) as seqnum
FROM `[project]`.[dataset].[table] t
) t
WHERE seqnum = 1
虽然我们只需要每个ID的最近一行,但此查询必须扫描整个表。随着表大小的增长,该查询每天都会变得更慢、更昂贵。现在,对于8GB的表,上面的查询将创建一个22MB的表。如果22MB表能够保持最新状态,我们更愿意查询它
是否可以创建一个物化视图来获取每个ID的最新行?
有比将表无限增长更好的解决方案吗?
其他要求:
- 保存历史数据(某处)
- 无法使用更新-我们将每天执行1500多个更新-
日期
以每日粒度创建主表(包含所有行)
创建一个单独的表,该表将只保留每个ID的最新行。使用整个主表的一次扫描填充该表一次,然后每天仅查询主表的最后一天来更新该表。由于分区查询,主表的最后一天将只扫描主表的最后一天。使用
\u PARTITIONTIME
@drum您能详细说明一下吗?按摄取时间对表进行分区,您将可以使用“PARTITIONTIME”列。这实际上是摄入时间,所以你可以或多或少地知道哪些是新记录。谢谢。该表已按数据的日期进行分区。我在寻找每个id的最新行。我不仅仅在寻找最新记录,我在寻找每个id的最新记录。因此,一个可能在最新记录中,但如果另一个id多年来一直无法更新,那么它将从2018年开始,等等。谢谢,表已经按数据的日期划分了。我会试试这个,然后回来报到!您知道如何在不显式命名的情况下更新行中的所有列吗?