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