选择每个组的最后一条记录作为实例化视图 1.使用 ARRAY_AGG2.然后,使用 OFFSET

问题描述

是否可以选择每个组中具有最高版本的记录并将其作为实例化视图存储在bigquery中?

源表

# dataframe 1 - the mappings
mappings = pd.DataFrame({
    'from': ['a','a','d','d'],'to': ['b','c','e','f','g']
})

# dataframe 2 - the labels
labels = pd.DataFrame({
    'name': ['a','b','g'],'f1': [1,1,1],'f2': [0,'f3': [0,0],})

# dataframe 3 - the expected output
output = pd.DataFrame(
    index = ['f1','f2','f3'],data = {
        'f1': [1,'f2': [4,2,'f3': [1,})

我只想获取每个组(按版本分组)的最后一条记录,因此输出应如下所示:

version name value
1       a    100
1       b    200
1       c    300
2       c    400

尝试了https://stackoverflow.com/a/1313293/5839247的回答,但出现错误: version name value 1 a 100 1 b 200 2 c 400 尝试了以下答案中的方法:https://stackoverflow.com/a/7745635/5839247,得到了Materialized views do not support analytic functions or WITH OFFSET.

文档:https://cloud.google.com/bigquery/docs/materialized-views#supported_mvs

解决方法

目前,BigQuery 的物化视图不支持 OFFSET。 因此,您必须创建另一个视图才能使用 OFFSET

1.使用 ARRAY_AGG

创建物化视图
CREATE MATERIALIZED VIEW dataset.mv_name AS
SELECT
  name,ARRAY_AGG(version ORDER BY version DESC) as versions,ARRAY_AGG(value ORDER BY version DESC) as values
FROM
  base_table
GROUP BY
  name

2.然后,使用 OFFSET

创建另一个视图
CREATE VIEW dataset.v_name AS
SELECT
  name,versions[OFFSET(0)] as last_version,values[OFFSET(0)] as last_value
FROM
  dataset.mv_name

这是official document

,

尝试以下方法(BigQuery标准SQL)

#standardSQL
SELECT AS VALUE ARRAY_AGG(t ORDER BY version DESC LIMIT 1)[OFFSET(0)]
FROM `project.dataset.table` t
GROUP BY name  

如果要应用于您的问题的样本数据-输出为

Row     version     name    value    
1       1           a       100  
2       1           b       200  
3       2           c       400  

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...