programing

PostgreSQL array_agg 순서

muds 2023. 5. 16. 23:13
반응형

PostgreSQL array_agg 순서

표 '동물':

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

매뉴얼의 다음 예와 같이 ORDER BY를 사용합니다.

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

당신이 포스트그리에 있는 경우SQL 버전 < 9.0 그러면:

보낸 사람: http://www.postgresql.org/docs/8.4/static/functions-aggregate.html

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

xmlagg(x) 시작(테스트 순서에서 x 선택 by yescript) 탭으로 선택

그래서 당신의 경우에는 다음과 같이 적을 것입니다.

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서브쿼리의 절.

Tom Lane에 따르면:

제가 제대로 읽는다면 OP는 두 집계 함수가 데이터를 *동일한* 지정되지 않은 순서로 볼 수 있도록 하기를 원합니다.저는 그것이 꽤 안전한 가정이라고 생각합니다.서버는 다른 방식으로 작업을 수행해야 하지만 실제로는 않습니다.

따라서 고유한 ORDER BY가 없는 Aggregate는 FROM 절이 제공하는 순서에 상관없이 행을 볼 수 있습니다.

따라서 쿼리에서 ORDER BY를 사용하지 않는 모든 Aggregate가 동일한 순서로 입력 데이터를 볼 수 있다고 가정해도 괜찮다고 생각합니다.그러나 순서 자체는 지정되지 않았습니다(FROM 절이 행을 제공하는 순서에 따라 다름).

출처: PostgreSQL 메일링 목록

수행할 작업:

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

언급URL : https://stackoverflow.com/questions/7317475/postgresql-array-agg-order

반응형