【问题标题】:Combine strings in a certain order按特定顺序组合字符串
【发布时间】:2021-11-10 08:01:15
【问题描述】:

示例表

NUMBER DEAL_NUMBER NAME1 NAME2
1 T01 TOM JERRY
2 T02 LEBRON STEVEN

希望输出如下:

NUMBER DEAL_NUMBER NAME1 NAME2 Name_COM
1 T01 TOM JERRY LEBRON TOM STEVEN JERRY
2 T02 LEBRON STEVEN LEBRON TOM STEVEN JERRY

使用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) Name_COM 背后的逻辑 - 你希望它如何组装 2) 为什么 string_agg 对你来说不够方便 - 请澄清以便我们可以进一步帮助你:o)
  • 1) 这里显示了编辑后的样本和目标输出,可能显示了组装的逻辑 2) 这里创建了额外的临时函数来解决或使用子查询,是否可以用更少的时间实现相同的结果查询?

标签: google-bigquery bigquery-udf


【解决方案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)      

如果应用于您问题中的样本数据 - 输出是

【讨论】:

  • 有效!谢谢伯利安特!比较方法后在这里找出思路。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 2023-01-21
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 2020-08-03
相关资源
最近更新 更多