Ниже для BigQuery Standard 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
и т. Д.), А скорее анализирует и извлекает все, что найдет. Очевидно, он основан на предположении о простых jsons, как в ваших примерах
Вы можете проверить, поиграть с выше, используя пример данных из вашего вопроса, как в примере ниже
#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"