# #google-bigquery #bigquery-udf
Вопрос:
Таблица образцов
номер | НОМЕР СДЕЛКИ | ИМЯ 1 | ИМЯ 2 |
---|---|---|---|
1 | T01 | самец | джерри |
2 | Т02 | ЛЕБРОН | СТИВЕН |
Хотелось бы получить результат, как показано ниже:
номер | НОМЕР СДЕЛКИ | ИМЯ 1 | ИМЯ 2 | Name_COM |
---|---|---|---|---|
1 | T01 | самец | джерри | ЛЕБРОН ТОМ СТИВЕН ДЖЕРРИ |
2 | Т02 | ЛЕБРОН | СТИВЕН | ЛЕБРОН ТОМ СТИВЕН ДЖЕРРИ |
С помощью функции string_agg можно решить с ее помощью, но это недостаточно удобно.
CREATE TEMP FUNCTION EXCHANGE_PLACE(STR STRING) RETURNS STRING AS (( SELECT ARRAY_TO_STRING(array_reverse(ARRAY_LIST),' ') FROM (SELECT SPLIT(STR,' ')ARRAY_LIST) )); WITH TBL_D_CUSTOMER AS ( SELECT "1" AS NUMBER,"T01" AS DEAL_NUMBER,"TOM" AS NAME1, "JERRY" AS NAME2 UNION ALL SELECT "2","T01","LEBRON","STEVEN" ) SELECT *, EXCHANGE_PLACE(STRING_AGG(NAME1,' ')OVER(PARTITION BY DEAL_NUMBER)) || ' ' || EXCHANGE_PLACE(STRING_AGG(NAME2,' ')OVER(PARTITION BY DEAL_NUMBER)) AS NAME_COM FROM TBL_D_CUSTOMER
Есть ли какой-нибудь подход, который может сделать это лучше?
Комментарии:
1. Пожалуйста, поясните 1) логику
Name_COM
— как вы хотите, чтобы он был собран 2) почемуstring_agg
он недостаточно удобен для вас — пожалуйста, поясните, чтобы мы могли помочь вам в дальнейшем :o)2. 1) здесь показан образец и целевой вывод после редактирования, он может показать логику сборки 2)здесь создайте дополнительную временную функцию для решения или использования подзапросов, можно ли выполнить тот же результат с меньшим количеством запросов?
Ответ №1:
Рассмотрим следующий подход
select *, array_to_string( array_reverse(array_agg(NAME1) over win) || array_reverse(array_agg(NAME2) over win) , ' ') as Name_COM from TBL_D_CUSTOMER window win as (partition by DEAL_NUMBER)
если применить к образцам данных в вашем вопросе — вывод будет
Комментарии:
1. Это работает! спасибо Берлянту! здесь выясните мышление после сравнения метода.
2. Рад, что это работает на вас. Подумайте о том, чтобы проголосовать за ответ, который помог, и принять лучший. Это мотивирует нас ответить на ваши следующие вопросы