Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql BigQuery表中按ID显示的最新行的物化视图?_Sql_Google Cloud Platform_Google Bigquery_Materialized Views - Fatal编程技术网

Sql BigQuery表中按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

我有一个BigQuery表,具有~5k个唯一ID。每天都会为可能存在或可能不存在的ID插入新行

我们使用此查询查找最近的行:

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年开始,等等。谢谢,表已经按
数据的日期划分了。我会试试这个,然后回来报到!您知道如何在不显式命名的情况下更新行中的所有列吗?