Как подсчитать количество уникальных значений столбца таблицы в 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;
Вид таблицы после вставки данных:
Мы сделали вставку 12 записей. Часть значений в столбце randomtext повторяются (не являются уникальными).
Получение уникальных значений столбца через команду SELECT и предложение DISTINCT
— Получение уникальных значений столбца через команду SELECT и предложение DISTINCT
SELECT DISTINCT randomtext FROM test.t_2022_11_18;
Само слово «DISTINCT» переводится с английского языка как «отдельный» или «отчётливый«. В нашем случае это указывает на уникальность.
После команды 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
Теперь, когда мы знаем как получить список уникальных значений столбца таблицы, мы можем воспользоваться агрегатной функцией 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.
В обоих случаях будут получены одинаковые результаты:
Мы получаем число 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