2014-10-14 14 views
12

Sonuç oluşturmak için aşağıdaki SQL sorgusunu yeniden yazmanın nasıl bir fikir olduğu, bu yalnızca bir ad olayı içerecek midir? (sonuç kullanıcı tarafından gruplandırılmış).array_agg postgres işleviyle oluşturulan duplicates nasıl kaldırılır

sorgu

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 

Çalıştırılabilir sorgu sqlfiddle.com üzerinde avaiable olduğunu. Frantisek Smith içeren sonuçta ortaya çıkacak Run SQL butonuna tıklayın ve iki kez

+2

'array_agg (ayrı concat (.. .))) ' –

+0

Postgre 9.0+ sürümünde' string_agg (text, text) işlevi vardır. String_agg (CONCAT (...), ',') ' –

+0

@a_horse_with_no_name 'in ayrı çalışmalarının yazılması daha kolay olabilir, ancak siparişi karıştırır. Bunu korumanın bir yolu var mı? – Rodrigo

cevap

23

Sen array_agg içine distinct anahtar kelime kullanabilirsiniz:

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

Siparişi farklı kullanarak korumak için herhangi bir yol var mı? – Rodrigo

+1

HATA: DISTINCT, pencere işlevleri için uygulanmadı SQL Durumu: 0A000 (PostgreSQL 9.5.5) – P01550n

+0

Kendi toplama işlevimi yazmak zorunda kalmamı sağladı! –