#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 . . . Это ответ на вопрос, который вы задали здесь. Если у вас есть другой вопрос, задайте его как новый вопрос.