2014-10-14 87 views
12

다음과 같은 SQL 쿼리를 다시 작성하여 결과를 생성하는 방법을 생각해보십시오. (결과는 사용자별로 그룹화 됨).array_agg postgres 함수로 생성 된 중복을 제거하는 방법

쿼리

SELECT array_to_string(array_agg(CONCAT(u.firstname, ' ', u.lastname)), ', ') 
FROM log_has_item logitem 
    INNER JOIN log log ON log.id = logitem.log_id 
    INNER JOIN worker u ON log.worker_id = u.id 
WHERE logitem.company_id = 1 

실행 쿼리는 sqlfiddle.com에 avaiable이다입니다. 프란 스미스를 포함하면됩니다 SQL 실행 버튼을 클릭하고, 두 번

+2

'array_agg (별개의 CONCAT를 (.. .)))' –

+0

postgre 9.0+에는'string_agg (text, text)'함수가 있습니다. 'string_agg (CONCAT (...), ',')' –

+0

@a_horse_with_no_name distinct가 잘 동작하지만 순서를 뒤섞는 것은 더 쉽습니다. 어떤 방법으로 그것을 보존 할 수 있습니까? – Rodrigo

답변

23

당신은 array_agg 내부의 distinct 키워드를 사용할 수 있습니다

SELECT ARRAY_TO_STRING(ARRAY_AGG(DISTINCT CONCAT(u.firstname, ' ', u.lastname)), ', ') 
FROM log_has_item logitem 
    INNER JOIN log log ON log.id = logitem.log_id 
    INNER JOIN worker u ON log.worker_id = u.id 
WHERE logitem.company_id = 1 

SQLFiddle with this example

+2

별개로 주문을 보존하는 방법은 무엇입니까? – Rodrigo

+1

오류 : 창 함수에 DISTINCT가 구현되지 않았습니다. SQL 상태 : 0A000 (PostgreSQL 9.5.5) – P01550n

+0

내 집계 함수를 작성하지 않아도됩니다! –