Google bigquery BigQuery物化视图-组中的最后一个

Google bigquery BigQuery物化视图-组中的最后一个,google-bigquery,materialized-views,Google Bigquery,Materialized Views,在BigQuery中,可以创建一个物化视图,其中包含基表中每个组的最新行 e、 g 我希望物化视图如下所示 Materialized view +----------+--------------+-------+ | group_id | timestamp | value | +----------+--------------+-------+ | 1 | '2020-01-02' | 0.2 | | 2 | '2020-01-02' | 0.1

在BigQuery中,可以创建一个物化视图,其中包含基表中每个组的最新行

e、 g

我希望物化视图如下所示

Materialized view 
+----------+--------------+-------+
| group_id | timestamp    | value |
+----------+--------------+-------+
|    1     | '2020-01-02' |   0.2 |
|    2     | '2020-01-02' |   0.1 |
+----------+--------------+-------+
BigQuery物化视图不支持分析函数或联接。
有没有其他方法可以创建这样的视图?

您可以使用带有exists逻辑的单个查询来确保为每个
组id
选择最新的记录:

SELECT group_id, timestamp, value
FROM yourTable t1
WHERE NOT EXISTS (SELECT 1 FROM yourTable t2
                  WHERE t2.group_id = t1.group_id AND t2.timestamp > t1.timestamp);

如果不使用分析函数或某种子查询,我想不出任何方法来获得所需的结果集。以上可能是这里最精简的选项,不使用分析函数。

您最多可以这样做,请注意,结果是一个包含一个项的数组

CREATE MATERIALIZED VIEW  name as
SELECT group_id,
max(t.timestamp) as timestamp,
ARRAY_AGG(t.value  IGNORE NULLS ORDER BY t.timestamp DESC LIMIT 1) as value 
FROM table t
group by group_id
那么你也需要一个视图

create view viewname as
SELECT group_id,timestamp
cast(value [safe_offset(0)] as string) as  value 
FROM materialized_view

这个查询本身就可以工作。不幸的是,当我创建物化视图时,它在物化视图中显示错误
不支持的运算符:Limit.
那么您可能运气不好。如果不在同一个表上使用分析函数或子查询,我想不出一种编写视图的方法。我认为不会有什么不同,所以我没有包括表中的所有列。不幸的是,两者之间存在差异。如果我需要获取多个列,而不仅仅是
value
,你能想出一种方法吗?我尝试将它们与TO_JSON_字符串组合,但这会在materialized view:Struct中产生一个错误
不支持的运算符。
@JuriKrainjukov在materialized view功能的这一阶段,这是您得到的最多值。如果需要额外的列,可以写多行,与
value
行相同,但是每个额外的列都有一行,只是想说声谢谢,非常有用!对于使用DBT的用户,可以使用
api.Relation.create
adapter.get_columns\u in_Relation
来处理列映射,以获取所有列,然后在For循环中呈现它们,不包括按分组的列。
CREATE MATERIALIZED VIEW  name as
SELECT group_id,
max(t.timestamp) as timestamp,
ARRAY_AGG(t.value  IGNORE NULLS ORDER BY t.timestamp DESC LIMIT 1) as value 
FROM table t
group by group_id
create view viewname as
SELECT group_id,timestamp
cast(value [safe_offset(0)] as string) as  value 
FROM materialized_view