以下是 BigQuery 标准 SQL
#standardSQL
SELECT STRING_AGG(y, ', ' ORDER BY y) json
FROM (
SELECT STRING_AGG(TRIM(x) ORDER BY t DESC LIMIT 1) y
FROM `project.dataset.table`,
UNNEST(SPLIT(REGEXP_REPLACE(json, r'{|}', ''))) x
GROUP BY TRIM(SPLIT(x, ':')[OFFSET(0)])
)
注意:上述解决方案是通用的,不需要事先知道属性名称(如a、b 等),而是解析并提取它会找到的任何内容。显然,它依赖于您的示例中的简单 json 假设
您可以使用您问题中的示例数据进行测试,使用上面的示例,如下例所示
#standardSQL
WITH `project.dataset.table` AS (
SELECT '{"a":"1", "b":"2"}' json, 3 t UNION ALL
SELECT '{"b":"4"}', 2 UNION ALL
SELECT '{"a":"4", "c":"5"}', 1
)
SELECT STRING_AGG(y, ', ' ORDER BY y) json
FROM (
SELECT STRING_AGG(TRIM(x) ORDER BY t DESC LIMIT 1) y
FROM `project.dataset.table`,
UNNEST(SPLIT(REGEXP_REPLACE(json, r'{|}', ''))) x
GROUP BY TRIM(SPLIT(x, ':')[OFFSET(0)])
)
结果
Row json
1 "a":"1", "b":"2", "c":"5"
因为(正如我所提到的)它足够通用 - 您可以添加具有更多属性的行,而无需更改代码,如下所示
#standardSQL
WITH `project.dataset.table` AS (
SELECT '{"a":"1", "b":"2"}' json, 3 t UNION ALL
SELECT '{"b":"4"}', 2 UNION ALL
SELECT '{"a":"4", "c":"5"}', 1 UNION ALL
SELECT '{"abc":"1", "xyz":"2"}', 3 UNION ALL
SELECT '{"abc":"3", "vwy":"4"}', 3
)
SELECT STRING_AGG(y, ', ' ORDER BY y) json
FROM (
SELECT STRING_AGG(TRIM(x) ORDER BY t DESC LIMIT 1) y
FROM `project.dataset.table`,
UNNEST(SPLIT(REGEXP_REPLACE(json, r'{|}', ''))) x
GROUP BY TRIM(SPLIT(x, ':')[OFFSET(0)])
)
结果
Row json
1 "a":"1", "abc":"1", "b":"2", "c":"5", "vwy":"4", "xyz":"2"