2016-10-07 3 views
2

Я использую Amazon Redshift.удалить дубликаты из разделенной запятой строки (Amazon Redshift)

У меня есть столбец в этой строке, который хранится как запятая, как Private, Private, Private, Private, Private, Private, United Healthcare. Я хочу удалить дубликаты из него, используя query, поэтому результат должен быть Private, United Healthcare. Я нашел некоторые решения, очевидно, из Stackoverflow и узнал, что это возможно с помощью регулярных выражений.

Таким образом, я попытался с помощью:

SELECT regexp_replace('Private, Private, Private, Private, Private, Private, United Healthcare', '([^,]+)(,\1)+', '\1') AS insurances; 

И

SELECT regexp_replace('Private, Private, Private, Private, Private, Private, United Healthcare', '([^,]+)(,\1)+', '\g') AS insurances; 

А также некоторые другие регулярные выражения, но, похоже, не работает. Любое решение?

+0

Это Postgres или Redshift? Версия Postgris Redshift основана на том, что она настолько стар, что ее нельзя сравнить с современными Postgres. –

+0

Это Redshift, но я думаю, что он использует базу данных postgrey. – Dev

+0

Это две разные вещи. Amazon Redshift - на основе старой версии Postgres. Это либо Redshift **, либо ** Postgres, но не оба, и тот факт, что предлагаемое решение 'regexp_split_to_table' не работает для вас, является признаком этого. –

ответ

2

Попробуйте этот путь,

SELECT array_agg(DISTINCT insurances) 
FROM (SELECT regexp_split_to_table('Private, Private, Private, Private, Private, Private, United Healthcare' 
       , ',\s+') AS insurances) x; 

Альтернативный способ

SELECT DISTINCT UNNEST(regexp_split_to_array('Private, Private, Private, Private, Private, Private, United Healthcare', ',\s+')) AS insurances; 

Проверка http://docs.aws.amazon.com/redshift/latest/dg/String_functions_header.html как проваливается с красным смещением, ни один из этих обращенных text к text[]

+0

[Amazon] (500310) Недействительная операция: функция regexp_split_to_table («неизвестно», «неизвестно») не существует; – Dev

+0

Обновленный ответ @Dev с использованием 'regexp_split_to_array' – cske

+0

http://docs.aws.amazon.com/redshift/latest/dg/c_unsupported-postgresql-functions.html. Функция 'regexp_split_to_array' не поддерживается в postgrey sql на красном смещении Amazon. – Dev

2

Альтернативный вариант заключается в попытке Python UDF , Простая функция Python дедуплирует строку и возвращает правильную версию.

2

Вот User-Defined Function (UDF) для Amazon Redshift:

CREATE FUNCTION f_uniquify (s text) 
    RETURNS text 
IMMUTABLE 
AS $$ 
    -- Split string by comma-space, remove duplicates, convert back to comma-separated 
    return ', '.join(set(s.split(', '))) 
$$ LANGUAGE plpythonu; 

Тестирование это с:

select f_uniquify('Private, Private, Private, Private, Private, Private, United Healthcare'); 

Returns:

United Healthcare, Private 

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

Смежные вопросы