Объединяйте строки в определенном порядке

# #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. Рад, что это работает на вас. Подумайте о том, чтобы проголосовать за ответ, который помог, и принять лучший. Это мотивирует нас ответить на ваши следующие вопросы