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

Google bigquery BigQuery:使用组选择整个重复字段,google-bigquery,Google Bigquery,我使用的是LegacySQL,但并不严格限于此。(尽管它确实有一些方法我觉得很有用,比如“HASH”) 无论如何,简单的任务是,我希望按一个顶级列进行分组,同时仍然保留嵌套+重复数据集的第一个实例 因此,以下“工作”,并产生嵌套输出: SELECT cd, subarray.* FROM [magicalfairy.land] 现在,我试图抓住整个第一个子阵列(老实说,我当然不希望它起作用) 以下是不起作用的地方: SELECT cd, FIRST(subarray.*)

我使用的是LegacySQL,但并不严格限于此。(尽管它确实有一些方法我觉得很有用,比如“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
            }
        ]
    }
]

使用标准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;

使用标准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;
试试下面(BigQuery标准SQL)

这将为您提供预期的结果-相当于“任意数组”
通过在OVER()子句中添加
orderbysort\u col
,可以将此解决方案扩展到“FIRST ARRAY”-假设sort\u col定义了逻辑顺序请尝试以下操作(BigQuery标准SQL)

这将为您提供预期的结果-相当于“任意数组”


通过在OVER()子句中添加
orderbysort\u col
,可以将此解决方案扩展到“FIRST ARRAY”-假设sort\u col定义了逻辑顺序

作为第二次(在您的问题中)查询的结果,您希望得到什么?第一个“错”在哪里?请详细说明,因为不清楚您希望使用示例更新什么。这取决于您对“第一个数组”的定义-如果您是指“任何”-请参阅下面由@Elliott Brossard提供的解决方案-在他的示例中使用您的表而不是T;如果你真的需要“首先,你需要定义它的含义。您可能会有一些额外的列,如timestamp,用于定义顺序!我的意思是any,但我认为任何_值都进入一个数组并从中返回一个值,或者它处于正确的级别/上下文以知道它有一个数组列表并返回其中一个完整数组?作为第二次(在您的问题中)查询的结果,您期望得到什么?第一个“错”在哪里?请详细说明,因为不清楚您希望使用示例更新什么。这取决于您对“第一个数组”的定义-如果您是指“任何”-请参阅下面由@Elliott Brossard提供的解决方案-在他的示例中使用您的表而不是T;如果你真的需要“首先,你需要定义它的含义。您可能会有一些额外的列,如timestamp,用于定义顺序!我的意思是any,但我认为任何_值进入一个数组并从中返回一个值,或者是在正确的级别/上下文中知道它有一个数组列表并返回其中一个完整的数组?我只想要第一个数组中与组匹配的值集。(其他的可以扔掉)这就是
任何_值
将要做的事情:。请注意,遗留SQL中的
FIRST
聚合函数具有误导性,因为对于一个组来说,没有“FIRST”值的概念。对于一组数组,我需要第一个数组的全部。*请参阅我对主要问题的评论,任何值都可以,但我想我要验证的是,任何_值都在这个select上下文中接收一个数组(不是所有数组中的一组扁平数组元素)。对不起,我继续并添加了对实际表的查询。我只需要与组匹配的第一个数组中的一组值。(其他的可以扔掉)这就是
任何_值
将要做的事情:。请注意,遗留SQL中的
FIRST
聚合函数具有误导性,因为对于一个组来说,没有“FIRST”值的概念。对于一组数组,我需要第一个数组的全部。*请参阅我对主要问题的评论,任何值都可以,但我想我要验证的是,任何_值都在这个select上下文中接收一个数组(不是所有数组中的一组扁平数组元素)。对不起,我继续了,并添加了对实际表的查询
SELECT cd, subarray 
FROM (
  SELECT cd, subarray, 
    ROW_NUMBER() OVER(PARTITION BY cd) AS num
  FROM `magicalfairy.land`
) WHERE num = 1