2014-10-14 6 views
12

Czy ktoś pomysł, jak przepisać następujące zapytanie SQL, aby wygenerować wyniki, które zawiera tylko jedno wystąpienie nazwy? (wyniki pogrupowane według użytkowników).Jak usunąć duplikaty, które są generowane z funkcją postgres array_agg

Zapytanie

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 

wykonywalny zapytanie jest dostarczony na sqlfiddle.com. Kliknij przycisk Run SQL i będzie wynikać, który zawiera Frantisek Smith dwukrotnie

+2

'array_agg (odrębną concat (.. .))) ' –

+0

W postgre 9.0+ dostępna jest funkcja' string_agg (text, text) '. Może być łatwiej napisać 'string_agg (CONCAT (...), ',')' –

+0

@a_horse_with_no_name odróżnia działa dobrze, ale miesza kolejność. Jakikolwiek sposób na zachowanie tego? – Rodrigo

Odpowiedz

23

Można użyć słowa kluczowego distinct wewnątrz array_agg:

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

Jakikolwiek sposób zachować zamówienie za pomocą różnych? – Rodrigo

+1

BŁĄD: DISTINCT nie jest zaimplementowany dla funkcji okna Stan SQL: 0A000 (PostgreSQL 9.5.5) – P01550n

+0

Uratował mnie przed koniecznością napisania własnej funkcji agregującej! –