Postgresql, как объединить строки, но только когда значения разные? - PullRequest
0 голосов
/ 30 апреля 2018

Я хочу создать представление, объединяющее мой столбец "страна". Моя таблица выглядит так:

project_ref | country
----------------------
1           | Italy
1           | Italy
2           | France
2           | Italy

В настоящее время я запускаю следующий запрос:

CREATE VIEW a AS
SELECT project_ref,
string_agg(country, ', ') AS country
FROM b GROUP BY project_ref ORDER BY project_num ASC;

и в результате я получаю следующую таблицу:

project_ref | country
----------------------------
1           | Italy, Italy
2           | France, Italy

Есть ли способ удалить дублирующиеся значения "Италия, Италия", чтобы "Италия" упоминалась только один раз?

Я бы хотел иметь следующую таблицу:

project_ref | country
---------------------------
1           | Italy
2           | France, Italy

Но я не могу найти способ туда добраться ... Есть идеи?

Я использую версию PostgreSQL 9.4.5.

Заранее большое спасибо!

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Просто добавьте distinct внутрь string_agg:

string_agg(distinct country, ', ')
0 голосов
/ 30 апреля 2018

Вы можете использовать подзапрос, чтобы удалить дубликаты записей и создать массив с ними. Если вы хотите сохранить коллекции стран в виде текста, разделенного запятой, используйте функцию ARRAY_TO_STRING следующим образом:

CREATE VIEW a AS
SELECT project_ref, 
ARRAY_TO_STRING(ARRAY(SELECT DISTINCT country 
                      FROM b q2 
                      WHERE q1.project_ref = q2.project_ref),',') AS country
FROM b q1 
GROUP BY project_ref

А вот ваш взгляд без дубликатов:

db=# SELECT * FROM a;
 project_ref |    country 
-------------+-----------------
           1 | Italy
           2 | France,Italy
(2 Zeilen)

Преимущество этого подхода в том, что вы можете запустить DISTINCT с более чем одним столбцом, используя DISTINCT ON (colmun1, column2, ...).

...