Избегайте дублирования значений в запросе SELECT в PostgreSQL

У меня есть стол с именем product который содержит две колонки:

id  name
1   p1
2   p2
3   p1
4   p3
5   p4

Я запускаю следующий запрос:

SELECT DISTINCT id, name FROM product;

В результате PostgreSQL выдает мне следующий вывод:

id  name
1   p1
2   p2
3   p1
4   p3
5   p4

Я хочу избежать дублирования значений в name поле, поэтому желаемый результат должен выглядеть следующим образом:

1   p1
2   p2
4   p3
5   p4

Как мне добиться этого?

3 ответа

PostgreSQL имеет синтаксис, чтобы сделать это довольно эффективно:

select   distinct on (name)
         id,
         name
from     product
order by name,
         id;

Заказ по названию обязателен.

http://www.postgresql.org/docs/9.0/static/sql-select.html

Если вы хотите получить список без дубликатов имен, используйте "отличное имя"

select distinct name from product;

и вы также можете добавить номер строки с помощью row_number()

select row_number() over (order by name ) as id, name_list.name
from (select distinct  name from product) as name_list;

Я бы порекомендовал использовать оператор SELECT ON () выше. Но если вы не хотите, чтобы дублированные данные помещались в вашу таблицу, вы можете добавить уникальное ограничение в столбце вашего имени.

Другие вопросы по тегам