SQL-запрос - Удаляет дубликаты, если больше чем 3 копируют?

параметр вложенной функции, снова переплетающий

def create_printers(n):
    for i in xrange(n):
        def printer(i=i): # Doesn't work without the i=i
            print i
        yield printer
6
задан Lance Roberts 24 July 2009 в 00:58
поделиться

2 ответа

with cte as (
  select row_number() over (partition by dupcol1, dupcol2 order by ID) as rn
     from table)
delete from cte
   where rn > 2; -- or >3 etc

Запрос производит «номер строки» для каждой записи, сгруппированный по (dupcol1, dupcol2) и упорядоченный по идентификатору. Фактически, этот номер строки подсчитывает «дубликаты», которые имеют одинаковые dupcol1 и dupcol2, и присваивает затем номер 1, 2, 3 .. N, упорядочивая по идентификатору. Если вы хотите сохранить только 2 «дубликата», вам необходимо удалить те, которым были присвоены номера 3,4, .. N , и об этой части позаботился DELLETE. . WHERE rn> 2;

Используя этот метод, вы можете изменить ORDER BY в соответствии с вашим предпочтительным порядком (например, ORDER BY ID DESC ), чтобы ПОСЛЕДНИЙ имеет rn = 1 , то следующий после последнего - rn = 2 и так далее. Остальное остается прежним, DELETE удалит только самые старые, поскольку они имеют самые высокие номера строк.

В отличие от этого тесно связанного вопроса , когда условие становится более сложным, использование CTE и row_number () упрощается. Производительность может быть проблемной, если не существует надлежащего индекса доступа.

7
ответ дан 9 December 2019 в 22:38
поделиться

ИМЕЕТ ваш друг

выберите идентификатор, подсчитайте (*) cnt из группы таблиц по идентификатору, имеющему cnt> 2

3
ответ дан 9 December 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: