SQL-запрос — удаление дубликатов

#sql #postgresql #postgresql-9.3 #postgresql-9.4 #postgresql-9.5

Вопрос:

У меня есть таблица со следующими важными столбцами:

 ID | commentid
1 | abs345
2 | abs345
3 | abs345
4 | poly234
5 | poly234
6 | qq1r4c
7 | abs345
8 | abs345
 

И я намерен удалить строки, в которых дублируется идентификатор комментария, то есть когда нумерация идентификаторов не соблюдается последовательно.
В этом примере строки с идентификаторами 7 и 8 будут удалены.

Комментарии:

1. Что вы имеете в виду под «идентификационный номер не следует последовательно»?

2. @GordonLinoff последовательно следует, например: 1,2,3 с тем же comment_id

3. Почему id=8 будет удален? Он последовательно следует за id=7. Это начинает выглядеть как проблема пробелов и островов…

Ответ №1:

Вы хотите вернуть все строки, кроме последнего идентификатора комментария, когда он дублируется?

 select t.*
from (select t.*,
             count(*) over (partition by commentid) as commentid_cnt,
             max(id) over (partition by commentid) as max_commentid_id,
             max(id) over () as max_id
      from t
     ) t
where max_id = max_comment_id and commentid_cnt > 1;
 

Редактировать:

О, кажется, я понимаю. Вы хотите сохранить только первую «группировку» commentid . Предполагая, что ис являются последовательными без пробелов, то один из подходов заключается в:

  • перечислите строки для каждой commentid
  • вычтите значение из id
  • Если это больше минимального идентификатора минус 1, то вы не входите в «первую» группу.

Это выглядит как:

 select t.*
from (select t.*,
             min(id) over (partition by commentid) as min_id,
             row_number() over (partition by commentid order by id) as seqnum
      from t
     ) t
where id - seqnum = min_id - 1
 

Комментарии:

1. Я хочу вернуть строки, когда идентификатор комментария дублируется. Дублирование происходит, когда «идентификатор» не равен » 1″… для того же самого «комментария»

2. да, это так! Спасибо 🙂 если я введу заданный идентификатор комментария, он вернет строки из «первой группы». Но если я захочу из «второй группы» ? Я уже пробовал, но не знаю, как это сделать…

3. @RenatoSantos . . . Это ответ на вопрос, который вы задали здесь. Если у вас есть другой вопрос, задайте его как новый вопрос.