Устранение повторяющихся строк в SQL: раскрытие возможностей функции RANK

Дубликаты строк — распространенная проблема при работе с базами данных. Они могут засорять ваши данные и привести к неточному анализу и отчетности. К счастью, SQL предоставляет мощные функции, такие как RANK, которые могут помочь эффективно идентифицировать и удалять повторяющиеся строки. В этой статье мы рассмотрим различные методы использования функции RANK и устранения повторяющихся строк из таблиц SQL.

Метод 1: использование функции РАНГ с общими табличными выражениями (CTE)
Начнем с простого примера. Рассмотрим таблицу «Сотрудники» со столбцами: идентификатор сотрудника, имя и зарплата. Чтобы удалить повторяющиеся строки на основе столбца имени, вы можете использовать функцию РАНГ в сочетании с CTE.

WITH ranked_employees AS (
   SELECT employee_id, name, salary, RANK() OVER (PARTITION BY name ORDER BY employee_id) AS rank
   FROM employees
)
DELETE FROM ranked_employees WHERE rank > 1;

Этот запрос присваивает ранг каждой строке на основе столбца имени, упорядоченного по идентификатору сотрудника. Строки с рангом больше 1 (т. е. повторяющиеся) удаляются из CTE.

Метод 2: удаление повторяющихся строк с помощью RANK и подзапросов.
Другой подход заключается в использовании подзапросов с функцией RANK для удаления повторяющихся строк. Предположим, у нас есть таблица с именем «orders» со столбцами: order_id, customer_id и order_date. Чтобы удалить повторяющиеся заказы на основе столбца customer_id, вы можете выполнить следующий запрос:

DELETE FROM orders
WHERE order_id IN (
   SELECT order_id
   FROM (
      SELECT order_id, RANK() OVER (PARTITION BY customer_id, order_date ORDER BY order_id) AS rank
      FROM orders
   ) AS ranked_orders
   WHERE rank > 1
);

Этот запрос удаляет строки из таблицы «orders», в которых order_id встречается более одного раза для определенной комбинации customer_id и order_date.

Метод 3: удаление повторяющихся строк с помощью RANK и самообъединений
В некоторых случаях может потребоваться удалить повторяющиеся строки на основе нескольких столбцов. Для этого вы можете использовать самообъединения вместе с функцией RANK. Давайте рассмотрим таблицу «Продукты» со столбцами: Product_id, имя, категория и цена. Чтобы удалить повторяющиеся продукты на основе столбцов имени и категории, вы можете использовать следующий запрос:

DELETE p1
FROM products p1
JOIN (
   SELECT product_id, RANK() OVER (PARTITION BY name, category ORDER BY product_id) AS rank
   FROM products
) p2
ON p1.product_id = p2.product_id
WHERE p2.rank > 1;

Этот запрос объединяет таблицу «продукты» с подзапросом, который присваивает ранги каждой строке на основе столбцов имени и категории. Строки с рангом больше 1 (т. е. дубликаты) удаляются из таблицы “продукты”.

В этой статье мы рассмотрели различные методы удаления повторяющихся строк с помощью функции RANK в SQL. Мы рассмотрели методы, включающие общие табличные выражения (CTE), подзапросы и самосоединения. Используя возможности функции РАНГ, вы можете эффективно выявлять и удалять повторяющиеся строки из таблиц базы данных, обеспечивая чистые и точные данные для вашего анализа и отчетности.