在时间戳字段上按天对BigQuery表进行查询

时间:2020-06-15 12:43:50

标签: google-bigquery

我在时间戳字段上按天对BigQuery表进行了划分,如下所示:

Table details

数据样本:

Row _time                    dummy_column
1   2020-06-15 23:57:00 UTC  a
2   2020-06-15 23:58:00 UTC  b
3   2020-06-15 23:59:00 UTC  c
4   2020-06-16 00:00:00 UTC  d
5   2020-06-16 00:00:01 UTC  e
6   2020-06-16 00:00:02 UTC  f

由于该表已在_time上分区,但它是按天分区的,因此,为了在特定的一天分区2020-06-15中进行查询,我运行:

select * from {DATASET}.{TABLE} where _time >= TIMESTAMP("2020-06-15") and _time < TIMESTAMP("2020-06-16");

结果:

Row _time                    dummy_column
1   2020-06-15 23:57:00 UTC  a
2   2020-06-15 23:58:00 UTC  b
3   2020-06-15 23:59:00 UTC  c

我的问题是:有没有一种方法可以通过显式地提及Day分区而不是使用时间戳范围来直接查询Day分区?

1 个答案:

答案 0 :(得分:1)

当表按天分区时,可以直接引用要查询的分区日。

为了演示您的情况,我使用了以下表模式:

Field name      Type    Mode      Policy tags   Description
date_formatted  DATE    NULLABLE    
fullvisitorId   STRING  NULLABLE    

其他表格的详细信息,

Table type              Partitioned
Partitioned by          Day
Partitioned on field    date_formatted
Partition filter        Not required

还有一些示例数据,

Row date_formatted  fullvisitorId
1   2016-12-30  6449885916997461186
2   2016-12-30  3401232735815769402
3   2016-12-30  2100622457042859506
4   2016-12-30  4434434796889840043
5   2016-12-31  9382207991125014696
6   2017-12-30  4226029488400478200
7   2017-12-31  4304624161918005939
8   2017-12-31  4239590118714521081
9   2018-12-30  0030006068136142781
10  2018-12-30  7849866399135936504

您可以使用以下语法查询以上示例数据,

DECLARE dt DATE DEFAULT Date(2016,12,30);

SELECT * FROM `project.dataset.table_name` WHERE date_formatted = dt

输出

Row date_formatted  fullvisitorId
1   2016-12-30  6449885916997461186
2   2016-12-30  3401232735815769402
3   2016-12-30  2100622457042859506
4   2016-12-30  4434434796889840043

如您所见,它仅检索了我声明的特定日期的数据。

请注意,我使用了DECLARE子句,因为它有助于修改日期过滤器。另外,如果您将字段格式设置为TIMESTAMP,则可以将DATE()替换为TIMESTAMP(),以在变量中定义过滤器。

作为其他信息,如果要使用范围,请考虑使用BETWEEN子句,例如WHERE partition_field BETWEEN date_1 and date_2

更新:

这一次我使用了示例数据,我使用了以下语法来创建与您所描述的完全相同的表。下面是代码:

create table dataset.table_name(_time timestamp, dummy_column string) partition by date(_time) 
as select  timestamp '2020-06-15 23:57:00 UTC' as _time, "a" as dummy_column  union all
select  timestamp '2020-06-15 23:58:00 UTC' as _time, "b" as dummy_column  union all
select  timestamp '2020-06-15 23:59:00 UTC' as _time, "c" as dummy_column  union all
select  timestamp '2020-06-16 00:00:00 UTC' as _time, "d" as dummy_column  union all
select  timestamp '2020-06-16 00:00:01 UTC' as _time, "e" as dummy_column  union all
select  timestamp '2020-06-16 00:00:02 UTC' as _time, "f" as dummy_column  

表格:

enter image description here

架构:

enter image description here

详细信息:

enter image description here

要从“时间戳”字段(_time)中仅选择一个日期,可以执行以下操作:

SELECT * FROM `project.dataset.table` WHERE DATE(_time) = "2020-06-15" 

输出,

enter image description here

如上图所示,输出是所需的。

此外,作为补充信息,我鼓励您阅读有关partition by的文档。