问题描述
是否可以选择每个组中具有最高版本的记录并将其作为实例化视图存储在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
,
尝试以下方法(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