PostgreSQL array_agg 순서


106

표 '동물':

animal_name animal_type
Tom         Cat
Jerry       Mouse
Kermit      Frog

질문:

SELECT 
array_to_string(array_agg(animal_name),';') animal_names,
array_to_string(array_agg(animal_type),';') animal_types
FROM animals;

예상 결과:

Tom;Jerry;Kerimt, Cat;Mouse;Frog
OR
Tom;Kerimt;Jerry, Cat;Frog;Mouse

첫 번째 집계 함수의 순서가 항상 두 번째와 동일하다는 것을 확신 할 수 있습니까? 나는 받고 싶지 않다는 것을 의미합니다.

Tom;Jerry;Kermit, Frog;Mouse,Cat

7
당신은 9.0에 있다면 당신은 하나와 중첩 호출을 대체 할 수있다string_agg()
a_horse_with_no_name

답변:


27

PostgreSQL 버전 9.0 미만인 경우 :

출처 : http://www.postgresql.org/docs/8.4/static/functions-aggregate.html

현재 구현에서 입력 순서는 원칙적으로 지정되지 않습니다. 그러나 정렬 된 하위 쿼리에서 입력 값을 제공하면 일반적으로 작동합니다. 예를 들면 :

SELECT xmlagg (x) FROM (SELECT x FROM test ORDER BY y DESC) AS 탭;

따라서 귀하의 경우에는 다음과 같이 작성합니다.

SELECT
array_to_string(array_agg(animal_name),';') animal_names,
array_to_string(array_agg(animal_type),';') animal_types
FROM (SELECT animal_name, animal_type FROM animals) AS x;

그런 다음 array_agg에 대한 입력은 순서가 지정되지 않지만 두 열 모두에서 동일합니다. 원하는 경우 ORDER BY하위 쿼리에 절을 추가 할 수 있습니다 .


330

매뉴얼의 다음 예와 같이 ORDER BY를 사용하십시오 .

SELECT array_agg(a ORDER BY b DESC) FROM table;

41
참고 : ORDER BYin array_agg은 PostgreSQL 9에서 도입되었습니다
UlfR 2011 년

6
PostgreSQL 9 이상을 가정 할 때 허용되는 답변보다 훨씬 낫습니다.
Erik

1
선택을 위해 ORDER BY로 샘플을 제공해 주시겠습니까? SELECT array_agg (animal_name), array_agg (animal_type) FROM animals; ?
Grigory Kislin 2014

8
이 않습니다 하지 작동array_agg(DISTINCT a ORDER BY b)
CERD

1
여러 열에 사용할 때 괄호를 추가해야합니다.array_agg((a, b, c) ORDER BY b)
bennos
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.