В SQL существует несколько способов получения уникальных данных из таблицы. Выбор метода зависит от конкретной задачи и требований к производительности.
Самый простой способ получить уникальные значения из одного или нескольких столбцов:
SELECT DISTINCT column1, column2
FROM table_name;
Особенности:
Пример с агрегатной функцией:
SELECT DISTINCT department_id, COUNT(*) OVER (PARTITION BY department_id)
FROM employees;
Альтернативный способ, который часто более эффективен:
SELECT column1, column2
FROM table_name
GROUP BY column1, column2;
Преимущества:
Пример с агрегацией:
SELECT department_id, COUNT(*) as emp_count
FROM employees
GROUP BY department_id;
Для сложных сценариев анализа данных:
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY column1, column2 ORDER BY some_column) as rn
FROM table_name
) t
WHERE rn = 1;
Особенности:
Автоматически удаляет дубликаты из объединенных результатов:
SELECT column1 FROM table1
UNION
SELECT column1 FROM table2;
Для выборки уникальных записей по сложным условиям:
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 | Зависит от данных | Низкая | Простая |
SELECT DISTINCT product_category
FROM products;
SELECT customer_id, product_id
FROM orders
GROUP BY customer_id, product_id;
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date DESC) as rn
FROM orders
) t
WHERE rn = 1;
SELECT DISTINCT status
FROM orders
WHERE order_date >= '2023-01-01';
Резюмируем: в SQL существует несколько эффективных способов получения уникальных записей, каждый из которых имеет свои преимущества в различных сценариях. DISTINCT подходит для простых случаев, GROUP BY - для более сложных запросов с агрегацией, а оконные функции - для продвинутой дедупликации. Выбор метода должен основываться на конкретных требованиях к данным и соображениях производительности.