BigQuery:使用组选择整个重复字段

时间:2016-08-18 18:17:45

标签: google-bigquery

我使用的是LegacySQL,但并不严格限制它。 (虽然它确实有一些我认为有用的方法,例如#34; HASH")。

无论如何,简单的任务是我想要按一个顶级列进行分组,同时仍然保留嵌套+重复数据集的第一个实例。

所以,以下"工作",并产生嵌套输出:

SELECT 
  cd,
  subarray.* 
FROM [magicalfairy.land]

现在我试图抓住整个第一个子阵列(老实说,我当然不希望这个工作) 以下是什么不起作用:

SELECT 
  cd,
  FIRST(subarray.*) 
FROM [magicalfairy.land]
GROUP BY cd

任何替代方法都将受到赞赏。

编辑,用于数据行为示例。

如果输入数据粗略:

[
    {
        "cd": "something",
        "subarray": [
            {
                "hello": 1,
                "world": 1
            },
            {
                "hello": 2,
                "world": 2
            }
        ]
    },
    {
        "cd": "something",
        "subarray": [
            {
                "hello": 1,
                "world": 1
            },
            {
                "hello": 2,
                "world": 2
            }
        ]
    }
]

期待离开:

[
    {
        "cd": "something",
        "subarray": [
            {
                "hello": 1,
                "world": 1
            },
            {
                "hello": 2,
                "world": 2
            }
        ]
    }
]

2 个答案:

答案 0 :(得分:1)

使用标准SQL保存结构会有更好的时间,例如:

WITH T AS (
  SELECT
    cd,
    ARRAY<STRUCT<x INT64, y BOOL>>[
      STRUCT(off, MOD(off, 2) = 0),
      STRUCT(off - 1, false)] AS subarray
  FROM UNNEST([1, 2, 1, 2]) AS cd WITH OFFSET off)
SELECT
  cd,
  ANY_VALUE(subarray) AS subarray
FROM T
GROUP BY cd;

ANY_VALUE会为每个组返回subarray的某些值。如果您想要连接数组,可以使用ARRAY_CONCAT_AGG

针对您的桌面运行此操作 - 请尝试以下

SELECT
  cd,
  ANY_VALUE(subarray) AS subarray
FROM `magicalfairy.land`
GROUP BY cd

答案 1 :(得分:1)

尝试以下(BigQuery标准SQL)

SELECT cd, subarray 
FROM (
  SELECT cd, subarray, 
    ROW_NUMBER() OVER(PARTITION BY cd) AS num
  FROM `magicalfairy.land`
) WHERE num = 1

这会给你预期的结果 - 相当于“ANY ARRAY”
通过将ORDER BY sort_col添加到OVER()子句中,可以将此解决方案扩展为“FIRST ARRAY” - 假设sort_col定义了逻辑顺序