BigQuery 具体化视图 - 最后一组
BigQuery materialized view - last in group
在 BigQuery 中是否可以创建包含每个组的最新行的实体化视图 table。
例如
CREATE TABLE basetable (
group_id INT64, timestamp TIMESTAMP, value FLOAT64
);
INSERT INTO basetable (group_id, timestamp, value) VALUES
(1, '2020-01-01', 0.1),
(1, '2020-01-02', 0.2),
(2, '2020-01-02', 0.1),
(2, '2020-01-01', 0.2);
Base table
+----------+--------------+-------+
| group_id | timestamp | value |
+----------+--------------+-------+
| 1 | '2020-01-01' | 0.1 |
| 1 | '2020-01-02' | 0.2 |
| 2 | '2020-01-02' | 0.1 |
| 2 | '2020-01-01 | 0.2 |
+----------+--------------+-------+
我希望物化视图如下所示
Materialized view
+----------+--------------+-------+
| group_id | timestamp | value |
+----------+--------------+-------+
| 1 | '2020-01-02' | 0.2 |
| 2 | '2020-01-02' | 0.1 |
+----------+--------------+-------+
BigQuery 具体化视图不支持分析函数或联接。
还有其他方法可以创建这样的视图吗?
您可以使用具有现有逻辑的单个查询来确保选择每个 group_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
在 BigQuery 中是否可以创建包含每个组的最新行的实体化视图 table。
例如
CREATE TABLE basetable (
group_id INT64, timestamp TIMESTAMP, value FLOAT64
);
INSERT INTO basetable (group_id, timestamp, value) VALUES
(1, '2020-01-01', 0.1),
(1, '2020-01-02', 0.2),
(2, '2020-01-02', 0.1),
(2, '2020-01-01', 0.2);
Base table
+----------+--------------+-------+
| group_id | timestamp | value |
+----------+--------------+-------+
| 1 | '2020-01-01' | 0.1 |
| 1 | '2020-01-02' | 0.2 |
| 2 | '2020-01-02' | 0.1 |
| 2 | '2020-01-01 | 0.2 |
+----------+--------------+-------+
我希望物化视图如下所示
Materialized view
+----------+--------------+-------+
| group_id | timestamp | value |
+----------+--------------+-------+
| 1 | '2020-01-02' | 0.2 |
| 2 | '2020-01-02' | 0.1 |
+----------+--------------+-------+
BigQuery 具体化视图不支持分析函数或联接。 还有其他方法可以创建这样的视图吗?
您可以使用具有现有逻辑的单个查询来确保选择每个 group_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