2017-11-14 11 views
0

열 내의 중복을 제거하기 위해 redshift 데이터베이스에 쿼리를 작성해야한다는 요구 사항이 있습니다.Redshift : 열 데이터 내의 중복을 제거하는 정규식

select regexp_replace('GiftCard,GiftCard', '([^,]*)(,\2)+($|,)', '\2\3') 

예상 결과 : GiftCard

얻은 결과 : 기본적으로 GiftCard,GiftCard

, 나는 열의 값을 검색하고 반복하면 제거 할.

아무도 도와 드릴 수 있습니까?

+1

합니까를 데이터는 항상 , ??처럼 보입니다. 다른 형식으로이 열에 대한 데이터가 표시됩니까? – hadooper

+0

예, 데이터는 항상 string1, string2, –

+0

이 될 것입니다. 데이터에 (string1, string1) always 또는 (string1, string2) (string1, string1)과 같은 열이 있는지 물어볼 수 있습니다. 이중 하나의 문자열 만 출력으로 가져 오는 값만 찾고 싶습니까? – hadooper

답변

0

정규식 쿼리를 사용하여이 작업을 수행 할 수 있는지 확실하지 않지만 Jon이 언급 한 것처럼 UDF는 매우 잘 작동합니다.

쉼표로 텍스트를 분할하고 고유 한 단어 집합을 만든 다음이를 형식으로 반환하십시오.

CREATE FUNCTION f_unique_words (s text) 
    RETURNS text 
IMMUTABLE 
AS $$ 
    return ','.join(set(s.split(','))) 
$$ LANGUAGE plpythonu; 

사용 예제 : 그것은 당신이 클러스터에 적합한 액세스 권한을 가지고에 의존 않습니다

> select f_unique_words('GiftCard,GiftCard'); 
[GiftCard] 
> select f_unique_words('GiftCard,Cat,Dog,Cat,Cat,Frog,frog,GiftCard'); 
[frog,GiftCard,Dog,Frog,Cat] 

기능은 다음과 같을 것이다. 함수를 만들려면 사용자에게 'plpythonu'라는 언어로 USAGE 권한을 부여해야합니다.

보조 노트로

당신이 낮은 경우에 모든 출력을 두지 않는이의 대소 문자를 구별하지 버전을 원하는 경우,이 할 것 :

CREATE FUNCTION f_unique_words_ignore_case (s text) 
    RETURNS text 
IMMUTABLE 
AS $$ 
    wordset = set(s.split(',')) 
    return ','.join(item for item in wordset if item.istitle() or item.title() not in wordset) 
$$ LANGUAGE plpythonu; 

사용 예제 :

> select f_unique_words_ignore_case('GiftCard,Cat,Dog,Cat,Cat,Frog,frog,GiftCard'); 
[GiftCard,Dog,Frog,Cat]