PostgreSQL | Сколько уникальных значений есть в столбце? — efim360.ru

PostgreSQL | Сколько уникальных значений есть в столбце?

Как подсчитать количество уникальных значений столбца таблицы в PostgreSQL?

Для получения результата нам понадобится таблица с данными. Вводные данные:

 

-- Тестовая таблица

CREATE TABLE IF NOT EXISTS test.t_2022_11_18 (

    id bigint NOT NULL GENERATED ALWAYS AS IDENTITY (INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 9223372036854775807 CACHE 1 ),

    randomtext text,

    CONSTRAINT t_2022_11_18_id_pkey PRIMARY KEY (id)

)

 

-- Вставляем тестовые данные

INSERT INTO test.t_2022_11_18 (randomtext) VALUES (unnest(ARRAY['A','B','C','C','S','F','F','F','F','F','G','G']));

 

-- Смотрим на результат вставки

SELECT * FROM test.t_2022_11_18;

 

Вид таблицы после вставки данных:

В столбце randomtext есть повторяющиеся значения - PostgreSQL
В столбце randomtext есть повторяющиеся значения - PostgreSQL

Мы сделали вставку 12 записей. Часть значений в столбце randomtext повторяются (не являются уникальными).

 

Получение уникальных значений столбца через команду SELECT и предложение DISTINCT

 

-- Получение уникальных значений столбца через команду SELECT и предложение DISTINCT

SELECT DISTINCT randomtext FROM test.t_2022_11_18;

 

 Само слово "DISTINCT" переводится с английского языка как "отдельный" или "отчётливый". В нашем случае это указывает на уникальность.

Получили уникальные значения столбца в PostgreSQL
Получили уникальные значения столбца в PostgreSQL

После команды SELECT мы записали предложение DISTINCT, а после DISTINCT мы указали имя столбца, по которому нужно получить уникальные значения.

Обратите внимание. что PostgreSQL возвращает результаты без определённой сортировки по какому-либо из признаков. Что первое нашёл, то и отдал.

В этом примере мы получили только один столбец вместо двух, как у оригинальной таблицы. Именно так нам нужно было получить итоговый результат.

 

Получение уникальных значений столбца через команду SELECT и предложение GROUP BY

 

-- Получение уникальных значений столбца через команду SELECT и предложение GROUP BY

SELECT randomtext FROM test.t_2022_11_18 GROUP BY randomtext;

 

 Выражение с предложением GROUP BY даёт точно такой же результат. Разница заключается в месте написания самого предложения и в указании столбца, по которому нужно выполнить группировку. GROUP BY записывается в конце всего выражения SELECT.

Получили уникальные значения столбца в PostgreSQL предложением GROUP BY
Получили уникальные значения столбца в PostgreSQL предложением GROUP BY

Выдача также непредсказуема по сортировке.

 

Подсчёт количества уникальных значений столбца таблицы в PostgreSQL

Теперь, когда мы знаем как получить список уникальных значений столбца таблицы, мы можем воспользоваться агрегатной функцией count() и рассчитать количество уникальных значений.

 

-- Подсчёт количества уникальных значений в столбце

SELECT count(DISTINCT randomtext) FROM test.t_2022_11_18;

-- или

SELECT count(*) FROM (SELECT randomtext FROM test.t_2022_11_18 GROUP BY randomtext) AS t18;

 

 Запись выражения с использованием предложения DISTINCT выглядит короче, чем с подзапросом и GROUP BY, а значит более понятнее для разработчика в PostgreSQL.

В обоих случаях будут получены одинаковые результаты:

Подсчитали количество уникальных записей в столбце таблицы - PostgreSQL
Подсчитали количество уникальных записей в столбце таблицы - PostgreSQL

Мы получаем число 6 (шесть) с типом данных bigint.

 

Информационные ссылки

Официальный сайт WEB-оболочки pgAdmin - https://www.pgadmin.org

Официальный сайт СУБД PostgreSQL - https://www.postgresql.org

Команды SQL - https://postgrespro.ru/docs/postgresql/15/sql-commands

Команда SELECT - https://postgrespro.ru/docs/postgresql/15/sql-select

Раздел "Агрегатные функции" - https://postgrespro.ru/docs/postgresql/15/functions-aggregate