# #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'
если применить к образцам данных в вашем вопросе — вывод будет