Sql - як видалити повторювані рядки sql-server - tsql, code q - a російська (ru)

Припускаючи, що немає нулів, ви 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 в одному запиті і повертає результати з повторюваним стовпцем і його лічильником.

Схожі статті