Подскажите технику/алгоритм

juwdoks

В таблице лога из 12 полей первые 2 - id и дата. Нужно удалить повторяющиеся записи по совпадению оставшихся 10 полей, оставив только самое раннее изменение (на первую дату или с минимальным id). Какой путь оптимальный? Выбрать во временную с rank() и потом join_ом удалить все где rank<>1? Или подзапросами дергать select min(id) по совпадению 10 полей? Или еще есть варианты?
7 ответов

juwdoks

juwdoks,а что мешает сразу удалять записи с rank != 1?


juwdoks

juwdoks,а что мешает сразу удалять записи с rank != 1?
Ругается что rank() в where...
Windowed functions can only appear in the SELECT or ORDER BY clauses.


juwdoks

В таблице лога из 12 полей первые 2 - id и дата. Нужно удалить повторяющиеся записи по совпадению оставшихся 10 полей, оставив только самое раннее изменение (на первую дату или с минимальным id). Какой путь оптимальный? Выбрать во временную с rank() и потом join_ом удалить все где rank<>1? Или подзапросами дергать select min(id) по совпадению 10 полей? Или еще есть варианты?
delete T
FROM aTable T 
WHERE exists(select * FROM aTable X WHERE T.f1=X.f1 AND... T.f10=X.f10 AND X.дата<=T.дата AND (X.дата<T.дата OR X.id<T.id))
как всеж таки испортили людей 2005/2008 сервера...


juwdoks

juwdoks,
delete T
FROM (select*, rank() over () N from aTable) T 
WHERE N > <b>1</b>
А вы уверены, что нужен rank, а не row_number()?


juwdoks

juwdoks,
delete T
FROM (select*, rank() over () N from aTable) T 
WHERE N > <b>1</b>
А вы уверены, что нужен rank, а не row_number()?
Кстати говоря, звёздочка тут лишняя,а в OVER() должно быть какое-нибудь ORDER BY


juwdoks

iap,* я ставлю по привычке, в select-update она нужна, а over - там не просто order by, так еще partition by могучий, но ТС вроде rank вызывать умеет, так что я писать поленился


juwdoks

iljy, aleks2Спасибо большое! Ваши подсказки помогли решить вопрос как хотелось.