【问题标题】:Create a BigQuery view to get the latest rows from a partitioned (and clustered) table创建 BigQuery 视图以从分区(和集群)表中获取最新行
【发布时间】:2022-01-19 11:28:28
【问题描述】:

问题

我正在尝试创建一个视图以从分区表中获取最新行,并根据日期分区 _LOCALDATETIME 和零个或多个集群字段进行过滤。我可以创建一个使用分区的视图,也可以创建一个处理一些过滤器的视图,但我无法确定实现这两者的语法。

查询需求示例

SELECT fieldA, fieldB, fieldC FROM theView
WHERE date between '2021-01-01' and '2021-12-31' AND
  _CLUSTERFIELD1 = 'foo'
GROUPBY _CLUSTERFIELD2
ORDERBY _CLUSTERFIELD3

表架构

_LOCALDATETIME
_id
_CLUSTERFIELD1
_CLUSTERFIELD2
_CLUSTERFIELD3
_CLUSTERFIELD4
...other fields

【问题讨论】:

  • 您好,只是为了澄清。您想使用已经过滤了分区数据的视图吗?作为分区数据。我认为您正在达到分区的限制,因为它不会是 top field
  • 你好@JasonBerryman 有更新吗?
  • 表已经被_LOCALDATETIME分区并聚集在指定的字段/要求是获取最新的行,基于_id对于任何已按分区和集群过滤的查询

标签: google-bigquery


【解决方案1】:

根据我从您的案例中了解到的情况,我采用了这种方法。 我已经创建了基于_LOCALDATETIME 的分区表和聚集字段,然后创建了从定义的日期范围返回数据的视图以及基于_id 的最后一个元素的值。因此,这将允许我查看具有固定日期范围内分区表的最后一项的视图。

查看

CREATE VIEW `<my-project-id>.<dataset>.<table>` AS
  with range_id as (
    select MAX(_id) as last_id_partition,_localdatetime as partition_ FROM
    `<my-project-id>.<dataset>.<table>` where _localdatetime BETWEEN "2020-01-01" and "2022-01-01" group by _localdatetime)
  SELECT s.*
  FROM
    `<my-project-id>.<dataset>.<table>` s
  inner join range_id r on s._id = r.last_id_partition and s._localdatetime = r.partition_ 
  where _localdatetime BETWEEN "2020-01-01" and "2022-01-01"
  group by _id,_localdatetime,_name,_location

视图将返回分区聚簇表的最后一个 ID,其中包含视图中的聚簇字段(即 2020 年和 2021 年)。

查询

select * from `<my-project-id>.<dataset>.<table>`
WHERE  _localdatetime between '2021-12-21' and '2021-12-22'
and <clusteredfield> = 'Venezuela'

它将返回该过滤器可用的记录,因为它已经在视图中defined

您不能做的是没有分区字段的视图,因为它必须存在才能查询分区表。您还可以更新使用 function 中的查询来进一步自定义您的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多