Sql 将表转换为多行的一个热编码

Sql 将表转换为多行的一个热编码,sql,google-bigquery,one-hot-encoding,Sql,Google Bigquery,One Hot Encoding,我有一个以下格式的SQL表: ID Cat 1 A 1 B 1 D 1 F 2 B 2 C 2 D 3 A 3 F 现在,我想创建一个表,每行一个ID,一行多个Cat。我希望的输出如下所示: 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多个Cat,所以我正在寻找自动编写的代码,而不是手动编写。谁能帮

我有一个以下格式的SQL表:

ID  Cat
1   A   
1   B
1   D
1   F
2   B
2   C
2   D
3   A
3   F
现在,我想创建一个表,每行一个ID,一行多个Cat。我希望的输出如下所示:

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多个Cat,所以我正在寻找自动编写的代码,而不是手动编写。谁能帮我解决这个问题?

BigQuery没有使用standardSQL的动态列,但根据下一步的操作,可能有一种方法可以让它更简单

下面的代码示例按ID对Cat进行分组,并使用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;

首先,让我将粘贴到实际表中的数据进行转换:

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,但需要使用该结果编写新的查询。

这可能有助于解决此问题!!你有没有试过做一些搜索?嗯,对我来说不是很有效。。。我知道这个查询太大了。最大标准SQL查询长度为1024.00K个字符,包括注释和空白字符。。。。我想我得合并查询之类的。这太傻了。它是:P