Как найти отдельные элементы в строке через запятую? - PullRequest
2 голосов
/ 05 июня 2019

Мне нравится находить отдельные элементы и упорядочивать их в строке, которая разделяется запятой с использованием стандартного SQL (BigQuery).

У меня уже есть строка типа:

B, A, A, D, C, B

Мне нравится генерировать:

A, B, C, D

Я пытался использовать функцию STRING_AGG .

SELECT STRING_AGG(DISTINCT split(str,","), "," ORDER BY str ASC )  AS string_agg
FROM  UNNEST ( [(select f0_ from temp3 )]) AS str

Я получаю сообщение об ошибке:

"Нет соответствующей сигнатуры для агрегатной функции STRING_AGG для типов аргументов:ARRAY, STRING "

Любое предложение по использованию других функций или изменение структуры.

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Ниже для BigQuery Standard SQL

#standardSQL
CREATE TEMP FUNCTION STRING_DEDUP(str STRING) AS (
  (SELECT STRING_AGG(item ORDER BY item) FROM (
    SELECT DISTINCT item FROM UNNEST(SPLIT(str)) item 
  ))  
);
SELECT 
  STRING_DEDUP(str) `string_agg`
FROM `project.dataset.table`  

Вы можете проверить, поиграть с выше, используя фиктивные данные, как в примере ниже

#standardSQL
CREATE TEMP FUNCTION STRING_DEDUP(str STRING) AS (
  (SELECT STRING_AGG(item ORDER BY item) FROM (
    SELECT DISTINCT item FROM UNNEST(SPLIT(str)) item 
  ))  
);
WITH `project.dataset.table` AS (
  SELECT 'B,A,A,D,C,B' str UNION ALL
  SELECT 'X,X,Z,Y,Y'
)
SELECT 
  STRING_DEDUP(str) `string_agg`
FROM `project.dataset.table`   

с результатом

Row string_agg   
1   A,B,C,D  
2   X,Y,Z    
1 голос
/ 05 июня 2019

Использование функции split - хорошая идея. Он возвращает массив строк, которые вы можете отсортировать и удалить дубликаты из него. Наконец, если вам нужен вывод строки, вы можете использовать функцию ARRAY_TOSTRING.

В целом, запустив этот запрос:

SELECT ARRAY_TO_STRING(
    ARRAY(SELECT DISTINCT x FROM UNNEST(split('b,a,a,b,d,c')) AS x ORDER BY x),
    ','
)

дает желаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...