簡體   English   中英

選擇需要對分區列進行過濾的 Bigquery 表的最新分區

[英]choose latest partition of a Bigquery table where filter over partition column is required

我一直在使用以下查詢

    SELECT DISTINCT
      *
    FROM
      `project.dataset.table` t
    WHERE DATE(_PARTITIONTIME) >= DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY) 

這並不理想,因為分區可能由於延遲而無法使用。因此我嘗試了以下查詢

    SELECT DISTINCT
      *
    FROM
      `project.dataset.table` t
    WHERE DATE(_PARTITIONTIME) IN 
    (
       SELECT 
         MAX(DATE(_PARTITIONTIME)) AS max_partition
       FROM `project.dataset.table`
       WHERE DATE(_PARTITIONTIME) >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
    )

    SELECT DISTINCT
      *
    FROM
      `project.dataset.table` t
    WHERE TIMESTAMP(DATE(_PARTITIONTIME)) IN 
    (
      SELECT parse_timestamp("%Y%m%d", MAX(partition_id))
      FROM `project.dataset.INFORMATION_SCHEMA.PARTITIONS`
      WHERE table_name = 'table'
    )

他們都沒有工作,因為

如果不過濾可用於分區消除的列“_PARTITION_LOAD_TIME”、“_PARTITIONDATE”、“_PARTITIONTIME”,則無法查詢表“project.dataset.table”。

在您的兩個解決方案中,分區列的限制過濾器都是在查詢期間計算的。 這導致全表掃描。

因此,您需要為分區列添加一個過濾器,該過濾器在查詢運行開始時始終是已知的。

SELECT DISTINCT
      *
    FROM
      `project.dataset.table` t
    WHERE DATE(_PARTITIONTIME) IN 
    (
       SELECT 
         MAX(DATE(_PARTITIONTIME)) AS max_partition
       FROM `project.dataset.table`
       WHERE DATE(_PARTITIONTIME) >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
    )
AND DATE(_PARTITIONTIME) >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)

如果最后一個分區日期可能是幾個月前,這是一個更好的解決方案:


Declare max_date date;

execute immediate
"""
SELECT max(date(_PARTITIONTIME)) FROM `project.dataset.table`
WHERE DATE(_PARTITIONTIME) > "2000-12-15"  
""" into max_date;

execute immediate
"""
Select * from `project.dataset.table`  where date(_PARTITIONTIME)= date('"""  || max_date || "')"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2025 STACKOOM.COM