Как получить уникальные записи в SQL?sql-100

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

В SQL существует несколько способов получения уникальных данных из таблицы. Выбор метода зависит от конкретной задачи и требований к производительности.

1. Использование DISTINCT

Самый простой способ получить уникальные значения из одного или нескольких столбцов:

SELECT DISTINCT column1, column2
FROM table_name;

Особенности:

  • Работает на уровне всей строки (комбинации указанных столбцов)
  • Можно использовать с агрегатными функциями
  • Медленнее на больших таблицах по сравнению с некоторыми альтернативами

Пример с агрегатной функцией:

SELECT DISTINCT department_id, COUNT(*) OVER (PARTITION BY department_id)
FROM employees;

2. Использование GROUP BY

Альтернативный способ, который часто более эффективен:

SELECT column1, column2
FROM table_name
GROUP BY column1, column2;

Преимущества:

  • Лучшая производительность на больших таблицах
  • Позволяет добавлять агрегатные функции
  • Более гибкий синтаксис для сложных запросов

Пример с агрегацией:

SELECT department_id, COUNT(*) as emp_count
FROM employees
GROUP BY department_id;

3. Использование оконных функций

Для сложных сценариев анализа данных:

SELECT *
FROM (
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY column1, column2 ORDER BY some_column) as rn
    FROM table_name
) t
WHERE rn = 1;

Особенности:

  • Позволяет выбирать "первую" уникальную запись по заданному критерию
  • Полезно для дедупликации данных
  • Ресурсоемкий метод

4. Использование UNION

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

SELECT column1 FROM table1
UNION
SELECT column1 FROM table2;

5. Использование EXISTS/NOT EXISTS

Для выборки уникальных записей по сложным условиям:

SELECT e1.*
FROM employees e1
WHERE NOT EXISTS (
    SELECT 1
    FROM employees e2
    WHERE e1.email = e2.email
    AND e1.employee_id < e2.employee_id
);

Сравнение методов

МетодПроизводительностьГибкостьСложность
DISTINCTСредняяНизкаяПростая
GROUP BYВысокаяСредняяСредняя
Оконные функцииНизкаяВысокаяСложная
UNIONЗависит от данныхНизкаяПростая

Практические примеры

Пример 1: Уникальные значения одного столбца

SELECT DISTINCT product_category
FROM products;

Пример 2: Уникальные комбинации нескольких столбцов

SELECT customer_id, product_id
FROM orders
GROUP BY customer_id, product_id;

Пример 3: Получение только первой записи для каждой группы

SELECT *
FROM (
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date DESC) as rn
    FROM orders
) t
WHERE rn = 1;

Пример 4: Уникальные значения с условием

SELECT DISTINCT status
FROM orders
WHERE order_date >= '2023-01-01';

Оптимизация производительности

  1. Для простых запросов на уникальность используйте DISTINCT
  2. Для агрегированных данных или сложных условий - GROUP BY
  3. Создавайте индексы на столбцах, используемых для определения уникальности
  4. Для больших таблиц рассмотрите материализованные представления
  5. Избегайте SELECT * с DISTINCT - указывайте только нужные столбцы

Резюмируем: в SQL существует несколько эффективных способов получения уникальных записей, каждый из которых имеет свои преимущества в различных сценариях. DISTINCT подходит для простых случаев, GROUP BY - для более сложных запросов с агрегацией, а оконные функции - для продвинутой дедупликации. Выбор метода должен основываться на конкретных требованиях к данным и соображениях производительности.