考虑以下架构,其中包含transaction_no,创建日期(created_at)&项(记录):
[
{
"mode":"REQUIRED",
"name":"Id",
"type":"INTEGER"
},
{
"fields":[
{
"mode":"REQUIRED",
"name":"Name",
"type":"STRING"
},
{
"mode":"REQUIRED",
"name":"Qty",
"type":"INTEGER"
}
],
"mode":"REPEATED",
"name":"Items",
"type":"RECORD"
},
{
"mode":"REQUIRED"
"name":"Transaction_no",
"type":"STRING"
},
{
"mode":"REQUIRED",
"name":"Created_at",
"type":"TIMESTAMP"
}
]
由于这个表再次包含相同的项目,我使用窗口函数来获取基于transaction_no&的最后一项。按这样的created_at排序转储到另一个表中:
SELECT *
FROM (
SELECT *
ROW_NUMBER() OVER(PARTITION BY transaction_no
ORDER BY created_at DESC) as last
FROM my_dataset.my_table
)
WHERE last = 1
不幸的是,这有以下问题。
Items
记录变平。我已将未选中的结果复选框取消选中我想在这里做的是删除重复项而不更改表结构。可能的?
答案 0 :(得分:2)
假设您的实际案例与您的示例一样简单(就架构而言)并且您有唯一的密钥来重新组合原始记录(看起来像你有这样的 - transaction_no ) - 最有效/最佳的方式(根据我的口味)是:
1.压平你的数据
2.执行所有聚合/分组逻辑
3.使用NEST()重新创建初始模式
在一个不错的查询中制作所有内容应该非常简单
另一种选择 - 如果您有时间进行实验 - 您可以尝试使用OMIT … IF
子句
请注意,它不仅可以OMIT RECORD IF
的形式使用,还可以以形式使用
OMIT {non-leaf node} IF
。后一种形式可用于根据所需条件OMIT Items IF condition
来消除重复字段中的某些条目
您可以阅读有关此https://cloud.google.com/bigquery/query-reference#omit
在您的特定情况下,我建议使用第一个选项,因为它更简单,实施起来相对简单