DROP TABLE abook; CREATE TABLE abook (count, name, address) AS SELECT DISTINCT ON(lower(address)) named.count, named.name || lower(unnamed.address), lower(unnamed.address) FROM contact unnamed LEFT OUTER JOIN ( SELECT DISTINCT ON (lower(address)) count(name), name, lower(address) AS laddr FROM contact WHERE name != '' GROUP BY lower(address), name ORDER BY lower(address), count DESC, name ) named ON named.laddr = lower(unnamed.address) ;