Припускаючи, що немає нулів, ви GROUP BY унікальними стовпцями і SELECT MIN (or MAX) RowId як рядки для збереження. Потім просто видаліть все, у яких не було ідентифікатора рядка:
Якщо у вас є ідентифікатор GUID замість цілого числа, ви можете замінити
Іншим можливим способом
Я використовую ORDER BY (SELECT 0) вище, оскільки він довільний, який рядок зберігається в разі прив'язки.
Щоб зберегти останній в RowID порядку, наприклад, ви можете використовувати ORDER BY RowID DESC
План виконання для цього часто простіше і ефективніше, ніж в прийнятому відповіді, оскільки він не вимагає самоподключенія.
Однак це не завжди так. Одне з місць, де краще використовувати рішення GROUP BY - це ситуації, коли хеш-агрегат вибирається краще агрегату потоку.
Рішення ROW_NUMBER завжди буде давати практично такий же план, тоді як стратегія GROUP BY більш гнучка.
Фактори, які могли б підтримати хеш-агрегатний підхід, були б
- Немає корисного індексу в шпальтах поділу
- Щодо менше груп з відносно великою кількістю дублікатів в кожній групі
В екстремальних версіях цього другого випадку (якщо в кожній групі дуже мало груп з багатьма дублікатами) можна також просто вставити рядки в нову таблицю, потім TRUNCATE - повернути оригінал і скопіювати їх назад, щоб звести до мінімуму ведення журналу в порівнянні з видаленням Дуже висока частка рядів.
Я використовував self-joins для цього в минулому, хоча, ймовірно, він був би перебільшений пропозицією HAVING:
Наступний запит корисний для видалення повторюваних рядків. Таблиця в цьому прикладі має ID як стовпці ідентифікації, а стовпці з дублюючими даними - Column1. Column2 і Column3.
Наступний сценарій показує використання GROUP BY. HAVING. ORDER BY в одному запиті і повертає результати з повторюваним стовпцем і його лічильником.