每个最后一个日期的BigQuery过滤器并使用分区

时间:2019-09-09 22:59:48

标签: google-bigquery

我问如何过滤上次日期并获得出色的答案(BigQuery, how to use alias in where clause?),它们都可以工作,但是,它们扫描整个表,SETTLEMENTDATE字段是一个分区字段,有没有办法只扫描一个分区

例如,我正在使用此查询

#standardSQL
SELECT * EXCEPT(isLastDate) 
FROM (
  SELECT *, DATE(SETTLEMENTDATE) = MAX(DATE(SETTLEMENTDATE)) OVER() isLastDate
  FROM `biengine-252003.aemo2.daily`
)
WHERE isLastDate 

编辑:由于数据存在滞后性,请确保最后日期并非总是当前日期

3 个答案:

答案 0 :(得分:2)

现在scripting is in beta在BigQuery中,您可以声明一个包含目标日期的变量。这是一个示例:

SET max_date DATE DEFAULT (SELECT DATE(MAX(datehour)) FROM `fh-bigquery.wikipedia_v3.pageviews_2019` WHERE wiki='es');

SELECT MAX(views)
FROM `fh-bigquery.wikipedia_v3.pageviews_2019` 
WHERE DATE(datehour) = max_date
AND wiki='es'

答案 1 :(得分:1)

假设SETTLEMENTDATE是DATE数据类型,您可以在下面使用它来获取今天的分区

SELECT *
FROM `biengine-252003.aemo2.daily`
WHERE SETTLEMENTDATE = CURRENT_DATE()     

或者例如昨天的分区

SELECT *
FROM `biengine-252003.aemo2.daily`
WHERE SETTLEMENTDATE = DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)     

更多信息,请访问https://cloud.google.com/bigquery/docs/querying-partitioned-tables#querying_partitioned_tables_2

答案 2 :(得分:1)

Mikhail的答案看起来像这样(处理公共数据):

SELECT MAX(views)
FROM `fh-bigquery.wikipedia_v3.pageviews_2019` 
WHERE DATE(datehour) = DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)     
AND wiki='es' 
# 122.2 MB processed

但是问题似乎想要这样:

SELECT MAX(views)
FROM `fh-bigquery.wikipedia_v3.pageviews_2019` 
WHERE DATE(datehour) = (SELECT DATE(MAX(datehour)) FROM `fh-bigquery.wikipedia_v3.pageviews_2019` WHERE wiki='es')     
AND wiki='es'
# 50.6 GB processed

...但小于50.6GB

现在您需要某种脚本,以2个步骤执行此操作:

max_date = (SELECT DATE(MAX(datehour)) FROM `fh-bigquery.wikipedia_v3.pageviews_2019` WHERE wiki='es')   

;

SELECT MAX(views)
FROM `fh-bigquery.wikipedia_v3.pageviews_2019` 
WHERE DATE(datehour) = {{max_date}}
AND wiki='es'
# 115.2 MB processed

您将不得不在BigQuery之外编写脚本-或等待https://issuetracker.google.com/issues/36955074上的新闻。