我在时间戳字段上按天对BigQuery表进行了划分,如下所示:
数据样本:
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分区?
答案 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
表格:
架构:
详细信息:
要从“时间戳”字段(_time)中仅选择一个日期,可以执行以下操作:
SELECT * FROM `project.dataset.table` WHERE DATE(_time) = "2020-06-15"
输出,
如上图所示,输出是所需的。
此外,作为补充信息,我鼓励您阅读有关partition by的文档。