postgres에서 중복 어레이 값 제거
나는 다양한 유형을 가지고 있습니다.bigint해당 배열에서 중복 값을 제거하려면 어떻게 해야 합니까?
예:array[1234, 5343, 6353, 1234, 1234]
나는 받아야만 합니다.array[1234, 5343, 6353, ...]
저는 그 예를 시험해 보았습니다.SELECT uniq(sort('{1,2,3,2,1}'::int[]))포스트그레스 설명서에 있지만 작동하지 않습니다.
저도 마찬가지입니다.하지만 제 경우 배열은 다음을 통해 생성됩니다.array_agg기능.또한 다음과 같은 DISTINCT 값을 집계할 수 있습니다.
array_agg(DISTINCT value)
이것은 나에게 효과가 있습니다.
및 기능은 어레이 내 기여 모듈에 의해 제공됩니다.
이 기능을 사용하려면 모듈을 설치해야 합니다.
어레이 내 기여 모듈을 사용하지 않거나 다른 유형의 어레이에서 중복을 제거해야 하는 경우 두 가지 방법이 있습니다.
적어도 Postgre가 있는 경우SQL 8.4를 활용할 수 있습니다.unnest(anyarray)기능.
SELECT ARRAY(SELECT DISTINCT UNNEST('{1,2,3,2,1}'::int[]) ORDER BY 1);
?column?
----------
{1,2,3}
(1 row)
또는 이 작업을 수행할 수 있는 자체 기능을 만들 수 있습니다.
CREATE OR REPLACE FUNCTION array_sort_unique (ANYARRAY) RETURNS ANYARRAY
LANGUAGE SQL
AS $body$
SELECT ARRAY(
SELECT DISTINCT $1[s.i]
FROM generate_series(array_lower($1,1), array_upper($1,1)) AS s(i)
ORDER BY 1
);
$body$;
다음은 호출 예입니다.
SELECT array_sort_unique('{1,2,3,2,1}'::int[]);
array_sort_unique
-------------------
{1,2,3}
(1 row)
이런 종류의 array_X 유틸리티에 대한 표준 라이브러리(?)는 어디에 있습니까?
검색 시도...표준은 없지만 일부 보기:
postgres.cz/wiki/Array_based_functions : 좋은 참조!
JDBurnZ/postgresql-any 어레이, 좋은 이니셔티브이지만 개선하려면 몇 가지 협업이 필요합니다.
wiki.postgresql.org/Snippets, 은 계획을 좌절시켰지만 "공식 위키"는 향상시키기 위해 협력이 필요합니다.
MADlib: 좋아요! ...하지만 그것은 "순수한 SQL 스니펫 slib"가 아닌 코끼리입니다.
가장 단순하고 빠른 속도array_distinct()스니펫-립 함수
가장 단순하고 더 빠른 구현은 다음과 같습니다.array_unique()또는array_distinct():
CREATE FUNCTION array_distinct(anyarray) RETURNS anyarray AS $f$
SELECT array_agg(DISTINCT x) FROM unnest($1) t(x);
$f$ LANGUAGE SQL IMMUTABLE;
참고: 배열을 제외한 모든 데이터 유형에서 예상대로 작동합니다.
SELECT array_distinct( array[3,3,8,2,6,6,2,3,4,1,1,6,2,2,3,99] ),
array_distinct( array['3','3','hello','hello','bye'] ),
array_distinct( array[array[3,3],array[3,3],array[3,3],array[5,6]] );
-- "{1,2,3,4,6,8,99}", "{3,bye,hello}", "{3,5,6}"
"부작용"은 요소 집합의 모든 배열을 폭발시키는 것입니다.
PS: JSONB 어레이는 잘 작동합니다.
SELECT array_distinct( array['[3,3]'::JSONB, '[3,3]'::JSONB, '[5,6]'::JSONB] );
-- "{"[3, 3]","[5, 6]"}"
편집: 더 복잡하지만 유용한 "drop nulls" 매개 변수
CREATE FUNCTION array_distinct(
anyarray, -- input array
boolean DEFAULT false -- flag to ignore nulls
) RETURNS anyarray AS $f$
SELECT array_agg(DISTINCT x)
FROM unnest($1) t(x)
WHERE CASE WHEN $2 THEN x IS NOT NULL ELSE true END;
$f$ LANGUAGE SQL IMMUTABLE;
사용.DISTINCT암시적으로 배열을 정렬합니다.중복을 제거하는 동안 어레이 요소의 상대적 순서를 유지해야 하는 경우 다음과 같이 기능을 설계할 수 있습니다(9.4 이후부터 작동해야 함).
CREATE OR REPLACE FUNCTION array_uniq_stable(anyarray) RETURNS anyarray AS
$body$
SELECT
array_agg(distinct_value ORDER BY first_index)
FROM
(SELECT
value AS distinct_value,
min(index) AS first_index
FROM
unnest($1) WITH ORDINALITY AS input(value, index)
GROUP BY
value
) AS unique_input
;
$body$
LANGUAGE 'sql' IMMUTABLE STRICT;
Postgre와 싸우기 위해 일련의 저장 프로시저(기능)를 조립했습니다.SQL의 배열 처리 부족이 만들어짐anyarray이러한 함수는 intarray처럼 정수가 아닌 모든 어레이 데이터 유형에서 작동하도록 설계되었습니다. https://www.github.com/JDBurnZ/anyarray
의 경우,로 필요한 은 의경우당필, 한요것은로입니다.anyarray_uniq.sql해당 파일의 내용을 복사하여 Postgre에 붙여넣습니다.SQL 쿼리를 실행하여 함수를 추가합니다.에는 배열정필경추우가한을 합니다.anyarray_sort.sql.
여기서 다음과 같이 간단한 쿼리를 수행할 수 있습니다.
SELECT ANYARRAY_UNIQ(ARRAY[1234,5343,6353,1234,1234])
합니다.ARRAY[1234, 6353, 5343]
또는 정렬이 필요한 경우:
SELECT ANYARRAY_SORT(ANYARRAY_UNIQ(ARRAY[1234,5343,6353,1234,1234]))
반환: 정히반환확:ARRAY[1234, 5343, 6353]
인라인 방식은 다음과 같습니다.
SELECT 1 AS anycolumn, (
SELECT array_agg(c1)
FROM (
SELECT DISTINCT c1
FROM (
SELECT unnest(ARRAY[1234,5343,6353,1234,1234]) AS c1
) AS t1
) AS t2
) AS the_array;
먼저 어레이에서 세트를 생성한 다음 고유한 항목만 선택한 다음 어레이로 다시 집계합니다.
단일 쿼리에서 다음 작업을 수행했습니다.
SELECT (select array_agg(distinct val) from ( select unnest(:array_column) as val ) as u ) FROM :your_table;
여전히 postgres 8.2를 처리해야 하는 저와 같은 사람들을 위해, 이 재귀 함수는 배열의 정렬을 변경하지 않고 중복을 제거할 수 있습니다.
CREATE OR REPLACE FUNCTION my_array_uniq(bigint[])
RETURNS bigint[] AS
$BODY$
DECLARE
n integer;
BEGIN
-- number of elements in the array
n = replace(split_part(array_dims($1),':',2),']','')::int;
IF n > 1 THEN
-- test if the last item belongs to the rest of the array
IF ($1)[1:n-1] @> ($1)[n:n] THEN
-- returns the result of the same function on the rest of the array
return my_array_uniq($1[1:n-1]);
ELSE
-- returns the result of the same function on the rest of the array plus the last element
return my_array_uniq($1[1:n-1]) || $1[n:n];
END IF;
ELSE
-- if array has only one item, returns the array
return $1;
END IF;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
예를 들어 다음과 같습니다.
select my_array_uniq(array[3,3,8,2,6,6,2,3,4,1,1,6,2,2,3,99]);
줄 것입니다
{3,8,2,6,4,1,99}
언급URL : https://stackoverflow.com/questions/3994556/eliminate-duplicate-array-values-in-postgres
'programing' 카테고리의 다른 글
| Postgresql 스키마 경로 영구 설정 (0) | 2023.05.04 |
|---|---|
| ASP에서 사용자 정의 오류 페이지를 작동시키는 방법.NET MVC 4 (0) | 2023.05.04 |
| bash 셸 스크립트에 파일을 포함하는 방법 (0) | 2023.05.04 |
| 파이썬 3의 수율 생성기에는 next() 함수가 없습니다. (0) | 2023.05.04 |
| mongodb를 업그레이드해도 효과가 없으며 이전 버전이 계속 표시됩니다. (0) | 2023.05.04 |