Skip to main content

Оператор DISTINCT

PostgreSQL оператор DISTINCT используется для удаления дубликатов из набора результатов. DISTINCT может использоваться только с операторами SELECT.

Синтаксис

Синтаксис для оператора DISTINCT в PostgreSQL:

SELECT DISTINCT | DISTINCT ON (distinct_expressions) expressions FROM tables [WHERE conditions];

Параметры и аргументы

  • distinct_expressions - выражения, используемые для удаления дубликатов.
  • expressions - столбцы или вычисления, которые вы хотите получить.
  • tables - таблицы, из которых вы хотите получить записи. В операторе FROM должна быть указана хотя бы одна таблица.
  • WHERE conditions - необязательный. Условия, которые должны быть выполнены для записей, которые будут выбраны.

Примечание

  • Если в DISTINCT указано только одно выражение, запрос возвратит уникальные значения для этого выражения.
  • Если в DISTINCT указано несколько выражений, запрос извлекает уникальные комбинации для перечисленных выражений.
  • Если заданы ключевые слова DISTINCT ON , запрос возвратит уникальные значения для distinct_expressions и вернет другие поля для выбранных записей на основе предложения ORDER BY (limit 1) .
  • В PostgreSQL DISTINCT не игнорирует значения NULL. Поэтому при использовании DISTINCT в вашем операторе SQL ваш результирующий набор будет содержать значение NULL как отдельное значение.

Пример с одним выражением

Рассмотрим на простейший пример DISTINCT в PostgreSQL. Мы можем использовать оператор DISTINCT, чтобы вернуть одно поле, которое удаляет дубликаты из набора результатов.
Например:

SELECT DISTINCT last_name
FROM contacts
ORDER BY last_name;

В этом PostgreSQL примере DISTINCT будут возвращены все уникальные значения last_name из таблицы contacts.

Пример с несколькими выражениями

Давайте посмотрим, как вы можете использовать оператор PostgreSQL DISTINCT для удаления дубликатов из более чем одного поля в вашем операторе SELECT.
Например:

SELECT DISTINCT last_name, city, state
FROM contacts
ORDER BY last_name, city, state;

Этот пример будет возвращать каждую уникальную комбинацию last_name, city и state из таблицы contacts. В этом случае DISTINCT применяется к каждому полю, указанному после ключевого слова DISTINCT, и, следовательно, возвращает различные комбинации.

Пример DISTINCT ON

Одна вещь, которая уникальна в PostgreSQL, по сравнению с другими базами данных, заключается в том, что у вас есть еще одна опция при использовании оператора DISTINCT, которая называется DISTINCT ON.
DISTINCT ON вернет только первую строку для DISTINCT ON (diver_expressions) на основе оператора ORDER BY, предоставленного в запросе. Любые другие поля, перечисленные в операторе SELECT, будут возвращены для этой первой строки. Это похоже на выполнение LIMIT в 1 для каждой комбинации DISTINCT ON (different_expressions).
Давайте подробнее рассмотрим, как использовать DISTINCT ON в операторе DISTINCT и что он возвращает.
Таким образом, мы могли бы изменить пример выше:

SELECT DISTINCT ON (last_name) last_name, city, state
FROM contacts
ORDER BY last_name, city, state;

Этот пример DISTINCT, в котором используются ключевые слова DISTINCT ON, вернет все уникальные значения last_name. Но в этом случае для каждого уникального значения last_name он будет возвращать только первую уникальную запись last_name, с которой он сталкивается, на основе оператора ORDER BY вместе с city и state значениями из этой записи.
Он не возвращает уникальные комбинации last_name, city и state. По сути, он выполняет LIMIT, равный 1, для каждого DISTINCT ON (last_name) и возвращает соответствующие значения city и state после того, как он выбрал возвращенные записи.

Список используемых источников