В этом уроке вы узнаете, как использовать предложение GROUP BY или функцию ROW_NUMBER() для поиска повторяющихся значений в таблице.
Технически вы используете ограничения UNIQUE для обеспечения уникальности строк в одном или нескольких столбцах таблицы. Однако иногда вы можете обнаружить дублирующиеся значения в таблице из-за плохого дизайна базы данных, ошибок приложения или неочищенных данных из внешних источников. Ваша задача — эффективно идентифицировать эти дублирующиеся значения.
Чтобы найти повторяющиеся значения в таблице, выполните следующие действия:
- Сначала определите критерии дубликатов: значения в одном столбце или в нескольких столбцах.
- Во-вторых, напишите запрос для поиска дубликатов.
Если вы также хотите удалить дубликаты строк, вы можете перейти к руководству по удалению дубликатов из таблицы.
Давайте создадим пример таблицы для демонстрации.
Создание таблицы образцов
Сначала создайте новую таблицу с именем t1, содержащую три столбца id, a и b.
DROP TABLE IF EXISTS t1; CREATE TABLE t1( id INT IDENTITY(1, 1), a INT, b INT, PRIMARY KEY(id) );
Затем вставьте несколько строк в таблицу t1:
INSERT INTO t1(a,b) VALUES (1,1), (1,2), (1,3), (2,1), (1,2), (1,3), (2,1), (2,2);
Таблица t1 содержит следующие повторяющиеся строки:
(1,2) (2,1) (1,3)
Ваша цель — написать запрос для поиска указанных выше дубликатов строк.
Использование предложения GROUP BY для поиска дубликатов в таблице
В этом операторе используется предложение GROUP BY для поиска дубликатов строк в столбцах a и b таблицы t1:
SELECT a, b, COUNT(*) occurrences FROM t1 GROUP BY a, b HAVING COUNT(*) > 1;
Вот результат:
Как это работает:
- Во-первых, предложение GROUP BY группирует строки в группы по значениям в столбцах a и b.
- Во-вторых, функция COUNT() возвращает количество вхождений каждой группы(a,b).
- В-третьих, предложение HAVING сохраняет только дублирующиеся группы, то есть группы, которые встречаются более одного раза.
Чтобы вернуть всю строку для каждой дублирующей строки, необходимо объединить результат приведенного выше запроса с таблицей t1, используя общее табличное выражение( CTE ):
WITH cte AS( SELECT a, b, COUNT(*) occurrences FROM t1 GROUP BY a, b HAVING COUNT(*) > 1 ) SELECT t1.id, t1.a, t1.b FROM t1 INNER JOIN cte ON cte.a = t1.a AND cte.b = t1.b ORDER BY t1.a, t1.b;
Вот что получилось:
Обычно запрос для поиска повторяющихся значений в одном столбце с использованием предложения GROUP BY выглядит следующим образом:
SELECT col, COUNT(col) FROM table_name GROUP BY col HAVING COUNT(col) > 1;
Запрос для поиска повторяющихся значений в нескольких столбцах с использованием предложения GROUP BY:
SELECT col1,col2,... COUNT(*) FROM table_name GROUP BY col1,col2,... HAVING COUNT(*) > 1;
Использование функции ROW_NUMBER() для поиска дубликатов в таблице
Следующий оператор использует функцию ROW_NUMBER() для поиска повторяющихся строк на основе столбцов a и b:
WITH cte AS( SELECT a, b, ROW_NUMBER() OVER( PARTITION BY a,b ORDER BY a,b) rownum FROM t1 ) SELECT * FROM cte WHERE rownum > 1;
Вот результат:
Как это работает:
Сначала ROW_NUMBER() распределяет строки таблицы t1 по разделам по значениям в столбцах a и b. Дублирующиеся строки будут иметь повторяющиеся значения в столбцах a и b, но разные номера строк, как показано на следующем рисунке:
Во-вторых, внешний запрос удаляет первую строку в каждой группе.
Как правило, этот оператор использует функцию ROW_NUMBER() для поиска повторяющихся значений в одном столбце таблицы:
WITH cte AS( SELECT col, ROW_NUMBER() OVER( PARTITION BY col ORDER BY col) row_num FROM t1 ) SELECT * FROM cte WHERE row_num > 1;
В этом руководстве вы узнали, как использовать предложение GROUP BY или функцию ROW_NUMBER() для поиска повторяющихся значений в SQL Server.