以下是 BigQuery 标准 SQL
#standardSQL
SELECT id, name, product_id,
ARRAY(
SELECT AS STRUCT year, ARRAY_AGG(STRUCT(month, weeks)) months
FROM (
SELECT year, month, ARRAY_AGG(STRUCT(week, value)) weeks
FROM (
SELECT
REGEXP_EXTRACT(kv, r'y(\d{4})') year,
REGEXP_EXTRACT(kv, r'm(\d{2})') month,
IFNULL(REGEXP_EXTRACT(kv, r'w\d{2}'), 'w0') week,
REGEXP_EXTRACT(kv, r': (\d*)') value
FROM UNNEST(REGEXP_EXTRACT_ALL(json, r'"y\d{4}m\d{2}(?:w\d{2})?": \d*')) kv
)
GROUP BY year, month
)
GROUP BY year
) AS json
FROM `project.dataset.table`
您可以使用您问题中的示例数据进行测试,如以下示例所示
#standardSQL
WITH `project.dataset.table` AS (
SELECT 2 id, 'Test2' name, 1234 product_id, '{"y2019m08w35": 0, "total": 0, "y2019m08w33": 0, "y2019m08": 0, "y2019m08w34": 0}' json UNION ALL
SELECT 1 id, 'Test' name, 8338 product_id, '{"y2018m08w35": 10,"y2019m08w35": 10, "y2019m08w33": 20, "y2019m08": 0, "y2019m09w34": 30, "y2019m10w34": 30, "y2019m10w35": 40}' json
)
SELECT id, name, product_id,
ARRAY(
SELECT AS STRUCT year, ARRAY_AGG(STRUCT(month, weeks)) months
FROM (
SELECT year, month, ARRAY_AGG(STRUCT(week, value)) weeks
FROM (
SELECT
REGEXP_EXTRACT(kv, r'y(\d{4})') year,
REGEXP_EXTRACT(kv, r'm(\d{2})') month,
IFNULL(REGEXP_EXTRACT(kv, r'w\d{2}'), 'w0') week,
REGEXP_EXTRACT(kv, r': (\d*)') value
FROM UNNEST(REGEXP_EXTRACT_ALL(json, r'"y\d{4}m\d{2}(?:w\d{2})?": \d*')) kv
)
GROUP BY year, month
)
GROUP BY year
) AS json
FROM `project.dataset.table`
结果
希望您可以在上面调整为您真正需要的任何命名 - 注意:除非您在 Excel 或表格中进行了模型,否则您的示例中的输出列的命名是不可行的,您显然可以随意命名内容:o)