Транспонирование строк в столбцы в BigQuery (реализация Pivot)
Я хочу создать новую таблицу и поместить все пары значений Ключей с ключами в качестве имен столбцов и значений в качестве их соответствующих значений с помощью BigQuery.
пример:
**Key** **Value**
channel_title Mahendra Guru
youtube_id ugEGMG4-MdA
channel_id UCiDKcjKocimAO1tV
examId 72975611-4a5e-11e5
postId 1189e340-b08f
channel_title Ab Live
youtube_id 3TNbtTwLY0U
channel_id UCODeKM_D6JLf8jJt
examId 72975611-4a5e-11e5
postId 0c3e6590-afeb
Я хочу преобразовать его в:
**channel_title youtube_id channel_id examId postId**
Mahendra Guru ugEGMG4-MdA UCiDKcjKocimAO1tV 72975611-4a5e-11e5 1189e340-b08f
Ab Live 3TNbtTwLY0U UCODeKM_D6JLf8jJt 72975611-4a5e-11e5 0c3e6590-afeb
Как это сделать с помощью BigQuery?
1 ответов
BigQuery еще не поддерживает функции поворота
Вы все еще можете сделать это в BigQuery, используя следующий подход
но во-первых, в дополнение к двум столбцам во входных данных вы должны иметь еще один столбец, который будет указывать группы строк во входных данных, которые должны быть объединены в одну строку в output
Итак, я предполагаю, что ваша входная таблица (yourTable) выглядит ниже
**id** **Key** **Value**
1 channel_title Mahendra Guru
1 youtube_id ugEGMG4-MdA
1 channel_id UCiDKcjKocimAO1tV
1 examId 72975611-4a5e-11e5
1 postId 1189e340-b08f
2 channel_title Ab Live
2 youtube_id 3TNbtTwLY0U
2 channel_id UCODeKM_D6JLf8jJt
2 examId 72975611-4a5e-11e5
2 postId 0c3e6590-afeb
Итак, сначала вы должны запустить ниже query
SELECT 'SELECT id, ' +
GROUP_CONCAT_UNQUOTED(
'MAX(IF(key = "' + key + '", value, NULL)) as [' + key + ']'
)
+ ' FROM yourTable GROUP BY id ORDER BY id'
FROM (
SELECT key
FROM yourTable
GROUP BY key
ORDER BY key
)
результат из вышеприведенного запроса будет строка, которая (если форматировать) будет выглядеть ниже
SELECT
id,
MAX(IF(key = "channel_id", value, NULL)) AS [channel_id],
MAX(IF(key = "channel_title", value, NULL)) AS [channel_title],
MAX(IF(key = "examId", value, NULL)) AS [examId],
MAX(IF(key = "postId", value, NULL)) AS [postId],
MAX(IF(key = "youtube_id", value, NULL)) AS [youtube_id]
FROM yourTable
GROUP BY id
ORDER BY id
теперь вы должны скопировать результат выше (Примечание :вам не нужно его форматировать - я сделал это только для представления) и запустить его как обычный запрос
результат будет таким, как вы ожидали
id channel_id channel_title examId postId youtube_id
1 UCiDKcjKocimAO1tV Mahendra Guru 72975611-4a5e-11e5 1189e340-b08f ugEGMG4-MdA
2 UCODeKM_D6JLf8jJt Ab Live 72975611-4a5e-11e5 0c3e6590-afeb 3TNbtTwLY0U
обратите внимание: вы можете пропустить Шаг 1 Если вы можете построить правильный запрос (как в шаге 2) и количество полей невелико и постоянно, или если это один раз сделка. Но Шаг 1 раз вспомогательный шаг, который делает его для вас, так что вы можете создать его быстро в любое время!
если вы заинтересованы - вы можете увидеть больше о повороте в моих других сообщениях.
как масштабировать поворот в BigQuery?
Обратите внимание – существует ограничение 10k столбцов на таблицу-поэтому вы ограничены 10k организациями.
Вы также можете увидеть ниже в качестве упрощенных примеров (если выше один слишком сложный/подробный):
как транспонировать строки в столбцы с большим объемом данных в BigQuery / SQL?
как создать фиктивные столбцы переменных для тысяч категорий в Google BigQuery?
Pivot повторяющиеся поля в BigQuery