powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Экспресс-вопрос: как удалить все записи кроме одной в каждой группе после группировки
7 сообщений из 7, страница 1 из 1
Экспресс-вопрос: как удалить все записи кроме одной в каждой группе после группировки
    #40094290
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую, такой экспресс-вопрос, как после группировки записей удалить(изменить) все записи в каждой группе, кроме первой(для простоты возьмём условие - кроме записи с наименьшим ид в группе).
Скажем есть запрос:
Код: sql
1.
2.
3.
4.
select fio, dateofbirth, address, postaddress, email, count(*)
from persons where <bla bla bla>
group by fio, dateofbirth, address, postaddress, email
having count(*) > 1



В целом задача состоит в получении дублей записей справочника и их удалении. В данном случае я с помощью группировки получил все дубли, теперь я знаю сколько их, а как теперь из каждой такой группы удалить(или например изменить) все записи кроме, скажем, первой.
...
Рейтинг: 0 / 0
Экспресс-вопрос: как удалить все записи кроме одной в каждой группе после группировки
    #40094293
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На вскидку, использовать оконную функцию rank(). А потом удалить записи у которых rank > 1
...
Рейтинг: 0 / 0
Экспресс-вопрос: как удалить все записи кроме одной в каждой группе после группировки
    #40094353
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Guzya
На вскидку, использовать оконную функцию rank(). А потом удалить записи у которых rank > 1

Спасибо, правда rank не подошёл, тут лучше подошло row_number(). В этом случае он нумерует строки в группах и становится возможным обработать их по своему условию.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select * from (
	    select pers.name, 
			pers.firstname, 
			pers.lastname, 
			pers.middlename, 
			pers.dateofbirth, 
			pers.legaladdress, 
			pers.postaladdress, 
			pers.phones, 
			pers.email,  	
			row_number() over (partition by pers.name) as rnk
	from sungero_parties_counterparty pers 
	where pers.discriminator = 'f5509cdc-ac0c-4507-a4d3-61d7a0a9b6f6' ) P 
where P.rnk = 1


Здесь теперь можно удалить все строки, где row_number > 1. Удивило, что нельзя использовать rn в условии в том же запросе, нужно делать внешний над этой выборкой.
...
Рейтинг: 0 / 0
Экспресс-вопрос: как удалить все записи кроме одной в каждой группе после группировки
    #40094354
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont know
Приветствую, такой экспресс-вопрос, как после группировки записей удалить(изменить) все записи в каждой группе, кроме первой(для простоты возьмём условие - кроме записи с наименьшим ид в группе).
Скажем есть запрос:
Код: sql
1.
2.
3.
4.
select fio, dateofbirth, address, postaddress, email, count(*)
from persons where <bla bla bla>
group by fio, dateofbirth, address, postaddress, email
having count(*) > 1



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


Ну например (проверить предварительно):
Код: sql
1.
2.
3.
4.
5.
6.
delete from persons where 
id NOT IN (
select min(p1.id) from from persons p1 where <bla bla bla>
group by p1.fio, p1.dateofbirth, p1.address, p1.postaddress, p1.email
)
AND (<bla bla bla>);



--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Экспресс-вопрос: как удалить все записи кроме одной в каждой группе после группировки
    #40094364
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,
Точно, можно же ещё одну агрегирующую ф-ию использовать, не подумал сразу, спасибо за идею )
...
Рейтинг: 0 / 0
Экспресс-вопрос: как удалить все записи кроме одной в каждой группе после группировки
    #40094993
Bear50
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
I dont know,
При удалении можно ещё ориентироваться на тех. столбец ctid при необходимости.
...
Рейтинг: 0 / 0
Экспресс-вопрос: как удалить все записи кроме одной в каждой группе после группировки
    #40095156
Kr_Yury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Совсем необязательно использовать группировку
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
delete from persons p where
   exists (select 1 from persons p1
            where p1.id < p.id
              and p1.fio = p.fio
              and p1.dateofbirth = p.dateofbirth
              and p1.address = p.address
              and p1.postaddress = p.postaddress
              and p1.email = p.email
              -- and  <bla bla bla>
          )
-- and  <bla bla bla>;

Если для каких-то колонок допустим Null, то для них в условия сравнения надо ещё coalesce добавить
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Экспресс-вопрос: как удалить все записи кроме одной в каждой группе после группировки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]