2014-10-14 13 views
12

Qualcuno ha idea di come riscrivere la query SQL seguente per generare risultati, che conterrebbe solo una occorrenza di nome? (risultati raggruppati per utente).Come rimuovere i duplicati, che vengono generati con la funzione array_agg postgres

La query

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 

interrogazione eseguibile e 'disponibile sul sqlfiddle.com. Fare clic sul pulsante Esegui SQL e si tradurrà, che contiene Frantisek Smith due volte

+2

'array_agg (concat distinti (.. .))) ' –

+0

In Postgre 9.0+ c'è la funzione' string_agg (text, text) '. Potrebbe essere più semplice scrivere 'string_agg (CONCAT (...), ',')' –

+0

@a_horse_with_no_name funziona bene, ma scrambles l'ordine. Un modo per preservarlo? – Rodrigo

risposta

23

È possibile utilizzare la parola chiave distinct all'interno 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

Un modo per mantenere l'ordine utilizzando distinti? – Rodrigo

+1

ERRORE: DISTINCT non è implementato per le funzioni della finestra SQL Stato: 0A000 (PostgreSQL 9.5.5) – P01550n

+0

Mi ha salvato dal dover scrivere la mia funzione di aggregazione! –

Problemi correlati