Скорее всего, вам нужна эта финальная таблица, чтобы затем использовать ее как объединение с какой-либо другой таблицей (-ами) - в этом случае такая сводоподобная схема в любом случае не самая эффективная опция, поэтому я бы рекомендовал рассмотреть вариант ниже, гдеВы сведете исходную матрицу в схему ID - столбец - значение
. В приведенном ниже примере - я предполагаю, что у вас есть наборы функций со значениями True / False, чтобы я мог легко согласовать «конфликтующие» значения, используя логические AND или OR -но тот же подход будет работать, если у вас действительно есть строки типа "T", "F" (конечно, в таком случае приведенный ниже код необходимо будет немного скорректировать)
Итак, ниже приведено описание для BigQuery Standard SQL и перед вами.Примените этот код, просто загрузив все свои файлы в отдельные таблицы (file1> table1, file2> table2 и т. д.)
#standardSQL
CREATE TEMP FUNCTION x(t STRING) AS ((
ARRAY(SELECT AS STRUCT col, val = 'true' val FROM
UNNEST(REGEXP_EXTRACT_ALL(t, r',"(.+?)":(?:true|false)')) col WITH OFFSET
JOIN UNNEST(REGEXP_EXTRACT_ALL(t, r',".+?":(true|false)')) val WITH OFFSET
USING(OFFSET))
));
SELECT id, col, LOGICAL_OR(val) val
FROM (
SELECT ID, col, val FROM `project.dataset.table1` t, UNNEST(x(TO_JSON_STRING(t)))
UNION ALL
SELECT ID, col, val FROM `project.dataset.table2` t, UNNEST(x(TO_JSON_STRING(t)))
)
GROUP BY id, col
Вы можете добавить столько строк, сколько вам нужно
UNION ALL
SELECT ID, col, val FROM `project.dataset.tableX` t, UNNEST(x(TO_JSON_STRING(t)))
Вы можете проверить, поиграть с выше, используя пример данных из вашего вопроса, как в примере ниже
#standardSQL
CREATE TEMP FUNCTION x(t STRING) AS ((
ARRAY(SELECT AS STRUCT col, val = 'true' val FROM
UNNEST(REGEXP_EXTRACT_ALL(t, r',"(.+?)":(?:true|false)')) col WITH OFFSET
JOIN UNNEST(REGEXP_EXTRACT_ALL(t, r',".+?":(true|false)')) val WITH OFFSET
USING(OFFSET))
));
WITH `project.dataset.table1` AS (
SELECT 1 ID, TRUE A, TRUE B, TRUE C UNION ALL
SELECT 2, FALSE, TRUE, FALSE UNION ALL
SELECT 3, FALSE, FALSE, FALSE
), `project.dataset.table2` AS (
SELECT 1 ID, TRUE A, TRUE B, TRUE D UNION ALL
SELECT 4, FALSE, TRUE, FALSE UNION ALL
SELECT 5, FALSE, FALSE, FALSE
)
SELECT id, col, LOGICAL_OR(val) val
FROM (
SELECT ID, col, val FROM `project.dataset.table1` t, UNNEST(x(TO_JSON_STRING(t)))
UNION ALL
SELECT ID, col, val FROM `project.dataset.table2` t, UNNEST(x(TO_JSON_STRING(t)))
)
GROUP BY id, col
-- ORDER BY id, col
с результатом
Row id col val
1 1 A true
2 1 B true
3 1 C true
4 1 D true
5 2 A false
6 2 B true
7 2 C false
8 3 A false
9 3 B false
10 3 C false
11 4 A false
12 4 B true
13 4 D false
14 5 A false
15 5 B false
16 5 D false
Из моего опыта в большинстве случаев использование приведенной выше схемы проще и проще, чем схема, которую вы изначально ожидали (в вашем вопросе)