我问如何过滤上次日期并获得出色的答案(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
编辑:由于数据存在滞后性,请确保最后日期并非总是当前日期
答案 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上的新闻。