Сначала позвольте мне преобразовать данные, которые вы вставили, в фактическую таблицу:
WITH data AS (
SELECT REGEXP_EXTRACT(data2, '[0-9]') id, REGEXP_EXTRACT(data2, '[A-Z]') cat
FROM (
SELECT SPLIT("""1 A
1 B
1 D
1 F
2 B
2 C
2 D
3 A
3 F""", '\n') AS data1
), UNNEST(data1) data2
)
SELECT * FROM data
(попробуйте поделиться таблицей в следующий раз)
Теперь мыможно выполнить ручное кодирование 1-hot:
SELECT id
, MAX(IF(cat='A',1,0)) cat_A
, MAX(IF(cat='B',1,0)) cat_B
, MAX(IF(cat='C',1,0)) cat_C
FROM data
GROUP BY id
Теперь мы хотим написать скрипт, который автоматически создаст нужные нам столбцы:
SELECT STRING_AGG(FORMAT("MAX(IF(cat='%s',1,0))cat_%s", cat, cat), ', ')
FROM (
SELECT DISTINCT cat
FROM data
ORDER BY 1
)
Это генерирует строку, которую вы можете скопировать вставить в запрос, которая 1-hot кодирует ваши массивы / строки:
SELECT id
,
MAX(IF(cat='A',1,0))cat_A, MAX(IF(cat='B',1,0))cat_B, MAX(IF(cat='C',1,0))cat_C, MAX(IF(cat='D',1,0))cat_D, MAX(IF(cat='F',1,0))cat_F
FROM data
GROUP BY id
И это именно то, о чем спрашивал вопрос.Вы можете генерировать SQL с помощью SQL, но вам нужно будет написать новый запрос, используя этот результат.