在BigQuery

时间:2016-01-07 20:35:54

标签: google-bigquery

考虑以下架构,其中包含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

不幸的是,这有以下问题。

  1. 这会使Items记录变平。我已将未选中的结果复选框取消选中
  2. 它似乎只从每个可重复记录中选取第一个字段。
  3. 我想在这里做的是删除重复项而不更改表结构。可能的?

1 个答案:

答案 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

的更多信息

在您的特定情况下,我建议使用第一个选项,因为它更简单,实施起来相对简单