我使用的是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
}
]
}
]
答案 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定义了逻辑顺序