Преобразовать таблицу в одноразовое кодирование для многих строк - PullRequest
1 голос
/ 09 мая 2019

У меня есть таблица SQL следующего формата:

ID  Cat
1   A   
1   B
1   D
1   F
2   B
2   C
2   D
3   A
3   F

Теперь я хочу создать таблицу с одним идентификатором в строке и несколькими кошками в строке. Мой желаемый вывод выглядит следующим образом:

ID  A  B  C  D  E  F
1   1  1  0  1  0  1
2   0  1  1  1  0  0
3   1  0  0  0  0  1

Я нашел:

Преобразовать таблицу в однократное кодирование значения одного столбца

Тем не менее, у меня более 1000 катов, поэтому я ищу код для написания этого автоматически, а не вручную. Кто может мне помочь с этим?

Ответы [ 2 ]

1 голос
/ 10 мая 2019

Сначала позвольте мне преобразовать данные, которые вы вставили, в фактическую таблицу:

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

enter image description here (попробуйте поделиться таблицей в следующий раз)

Теперь мыможно выполнить ручное кодирование 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

enter image description here

Теперь мы хотим написать скрипт, который автоматически создаст нужные нам столбцы:

SELECT STRING_AGG(FORMAT("MAX(IF(cat='%s',1,0))cat_%s", cat, cat), ', ') 
FROM (
  SELECT DISTINCT cat
  FROM data
  ORDER BY 1
)

enter image description here

Это генерирует строку, которую вы можете скопировать вставить в запрос, которая 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

enter image description here

И это именно то, о чем спрашивал вопрос.Вы можете генерировать SQL с помощью SQL, но вам нужно будет написать новый запрос, используя этот результат.

0 голосов
/ 10 мая 2019

BigQuery не имеет динамического столбца со стандартным SQL, но в зависимости от того, что вы хотите сделать на следующем шаге, может быть способ сделать это проще.

Следующие примеры кода групп Cat by ID и использует функцию JavaScript для выполнения быстрого кодирования и возврата строки JSON.

CREATE TEMP FUNCTION trans(cats ARRAY<STRING>)
RETURNS STRING
LANGUAGE js
AS
"""
// TODO: Doing one hot encoding for one cat and return as JSON string
return "{a:1}";
"""
;
WITH id_cat AS (
SELECT 1 as ID, 'A' As Cat UNION ALL
SELECT 1 as ID, 'B' As Cat UNION ALL
SELECT 1 as ID, 'C' As Cat UNION ALL
SELECT 2 as ID, 'A' As Cat UNION ALL
SELECT 3 as ID, 'C' As Cat)
SELECT ID, trans(ARRAY_AGG(Cat))
FROM id_cat
GROUP BY ID;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...