BigQuery SQL преобразует четыре столбца в один столбец с именем столбца в качестве значения

# #sql #google-bigquery

Вопрос:

В настоящее время у меня есть таблица, которая выглядит так:

 id      code_44145  code_44146  code_44207  code_44208  
6580671    1             0          0           0
1639363    0             1          0           0
 

Можно ли преобразовать мои данные в:

 id          code    
6580671    44145
1639363    44146
 

Где имя столбца, равное 1 , становится значением code в новом измененном наборе данных. Я уже предварительно отсортировал набор данных таким образом, чтобы не было случая, когда более одного столбца равно 1 .

Ответ №1:

Рассмотрим следующий подход

 select id, trim(col, 'code_') code 
from data
unpivot (code for col in (code_44145, code_44146, code_44207, code_44208))
where code !=0     
 

если применить к образцам данных в вашем вопросе — вывод будет

введите описание изображения здесь

Ответ №2:

Один метод использует case выражения. Предполагая, что по одному 1 на строку:

 select id,
       (case when code_44145 = 1 then 44145
             when code_44146 = 1 then 44146 
             when code_44207 = 1 then 44207
             when code_44208 = 1 then 44208
        end) as code
from t;
 

Ответ №3:

Рассмотрим еще один совершенно другой подход — он даже не требует явного включения столбцов

 select id, trim(split(kv, ':')[offset(0)], 'code_') code
from data t, unnest(split(translate(to_json_string(t), '{}"', ''))) kv
where split(kv, ':')[offset(0)] != 'id'
and split(kv, ':')[offset(1)] = '1'     
 

если применить к образцам данных в вашем вопросе — вывод будет

введите описание изображения здесь