BigQuery сортирует CONCAT из нескольких строковых столбцов в SELECT - PullRequest
2 голосов
/ 29 октября 2019

Сначала я приведу пример того, чего я пытаюсь достичь, а затем поделюсь немного большей информацией. Это довольно простая задача для объяснения, однако я новичок в BigQuery и не уверен, что задача проста для реализации или нет.

У меня есть набор данных имен, и я пытаюсь объединить имена водин столбец, однако имена должны быть отсортированы в первую очередь. Набор данных выглядит следующим образом:

p1    p2    p3    p4
Nick  Tom   Joe   Chris
Sal   Bill  Tom   Joe
Nick  Joe   Chris Sal
Nick  Joe   Joe   Chris

Я хотел бы создать 5-й столбец, который объединит p1, p2, p3 и p4 в отсортированном виде, чтобы вывод был таким:

p1    p2    p3    p4    concat_col
Nick  Tom   Joe   Chris Chris_Joe_Nick_Tom
Sal   Bill  Tom   Joe   Bill_Joe_Sal_Top
Nick  Joe   Chris Sal   Chris_Joe_Nick_Sal
Nick  Joe   Tom   Chris Chris_Joe_Nick_Top

В настоящее время у меня есть следующее

SELECT 
  p1, p2, p3, p4,
  concat(p1, '_', p2, '_', p3, '_', p4) as concat_col
FROM 
  my_table

... и это объединяет столбцы, но, очевидно, не делает это в отсортированном виде. Любая помощь с этим приветствуется!

Ответы [ 2 ]

4 голосов
/ 29 октября 2019

Вы можете поместить строки в массив, разложить их и повторно объединить:

select t.*,
       (select string_agg(el, '_' order by el)
        from unnest(array[t.p1, t.p2, t.p3, t.p4]) el
       ) as str
from (select 'Nick' as p1, 'Tom' as p2, 'Joe' as p3, 'Chris' as p4 union all
      select 'Sal', 'Bill', 'Tom', 'Joe' union all
      select 'Nick', 'Joe', 'Chris', 'Sal' union all
      select 'Nick', 'Joe', 'Joe', 'Chris'
     ) t ;
2 голосов
/ 29 октября 2019

В некоторых случаях использования - вы не хотите зависеть от имен столбцов - ниже общий код помогает с этим

#standardSQL
SELECT *, 
  (
    SELECT STRING_AGG(TRIM(item), '_' ORDER BY TRIM(item))
    FROM UNNEST(REGEXP_EXTRACT_ALL(FORMAT('%t', t), r'[^(),]+')) item
  ) AS concat_col
FROM my_table t   

Как вы можете видеть, приведенный выше код по-прежнему не вызывает имя столбцадает ожидаемый результат

Row p1      p2      p3      p4      concat_col   
1   Nick    Tom     Joe     Chris   Chris_Joe_Nick_Tom   
2   Sal     Bill    Tom     Joe     Bill_Joe_Sal_Tom     
3   Nick    Joe     Chris   Sal     Chris_Joe_Nick_Sal   
4   Nick    Joe     Joe     Chris   Chris_Joe_Joe_Nick   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...