параметр вложенной функции, снова переплетающий
def create_printers(n):
for i in xrange(n):
def printer(i=i): # Doesn't work without the i=i
print i
yield printer
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 () упрощается. Производительность может быть проблемной, если не существует надлежащего индекса доступа.
ИМЕЕТ
ваш друг
выберите идентификатор, подсчитайте (*) cnt из группы таблиц по идентификатору, имеющему cnt> 2