Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Удаление дубликатов в таблице / 9 сообщений из 9, страница 1 из 1
06.08.2018, 19:29
    #39683934
wilwin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов в таблице
Всем привет.
Помогите плиз с решением следующей задачи.
Есть таблица doc, в ней поля stat, nomer. Поле stat может принимать два значения, а поле nomer содержит соответственно номера (которые могут и повторяться). Вопрос: как удалить дубликаты записей колонки nomer оставив только последние из дублей.
P.S. Мой запрос удаляет все кроме первой записи дубликатов

--delete from doc
--where nomer in (
--select nomer
--from (select nomer,row_number() over (partition by nomer) as rn from doc) t
--where t.rn>1)
...
Рейтинг: 0 / 0
06.08.2018, 20:10
    #39683957
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов в таблице
wilwinВсем привет.
Помогите плиз с решением следующей задачи.
Есть таблица doc, в ней поля stat, nomer. Поле stat может принимать два значения, а поле nomer содержит соответственно номера (которые могут и повторяться). Вопрос: как удалить дубликаты записей колонки nomer оставив только последние из дублей.
P.S. Мой запрос удаляет все кроме первой записи дубликатов

--delete from doc
--where nomer in (
--select nomer
--from (select nomer,row_number() over (partition by nomer) as rn from doc) t
--where t.rn>1)
Таки сформулирую Вашу задачу более внятно.
В таблице есть несколько строк. Для каждого из двух уникальных значений stat может быть несколько номеров nomer, поэтому нужно оставить для каждого stat одну строку с последним значением nomer.

Вопрос - как это сделать?
Ответ - никак. Потому что нет однозначного фактора, который определяет "последний" из дублей.

Например, строки по порядку.
stat nomer
yes 10
no 11
yes 8
yes 7
no 12

Если последние по порядку yes-7 и no-12, то это один расклад, нужно оставить 4-ю и 5-ю строки, удалив все остальное. Если "последние" - это максимальные, тогда это yes-10 и no-12, нужно оставить 1-ю и 5-ю строки.

А проблема у Вас, автор темы, в том, что строки из 2 столбцов лежат неупорядоченно и могут возвращаться в любом порядке .
Перенумеруете - а реально запрос выведет строки так (и таки будет их нумеровать через row_number() ).
То есть Вы решили оставить 4-ю и 5-ю, а запрос с командой delete будет работать над таким набором:
yes 8
yes 7
yes 10
no 11
no 12

И удалите Вы совсем не то. Понятно, в чем подвох?

P.S. Таки сформулируйте условие задачи алгоритмически верно и кошерно.
...
Рейтинг: 0 / 0
06.08.2018, 23:03
    #39683995
wilwin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов в таблице
Таблица выглядит так:
stat | nomer |
A 165
A 197
T 165
A 238
T 854
A 197
А 165

необходимо выбрать дубли колонки nomer, это записи 1 и 3 и 7 (165),
2 и 6 (197) и удалить соответственно 1 , 2, 3
...
Рейтинг: 0 / 0
07.08.2018, 17:59
    #39684431
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов в таблице
wilwinТаблица выглядит так:
stat | nomer |
A 165
A 197
T 165
A 238
T 854
A 197
А 165

необходимо выбрать дубли колонки nomer, это записи 1 и 3 и 7 (165),
2 и 6 (197) и удалить соответственно 1 , 2, 3
Таки ключевое тут "таблица выглядит ".
То, что у Вас вернулось как A 165, а затем A 197, в другом запросе вернется как A 197, A 165.

неявный номер строки только для этого запроса и этого порядка сортировки stat | nomer |
1 A 165
2 A 197
3 T 165
4 A 238
5 T 854
6 A 197
7 А 165

"это записи 1 и 3 и 7 (165)" - это сейчас они 1 и 3 и 7, а если будут 3 и 7 и 1, Вы захотите удалить первые две, которые сейчас 3 и 7 и оставить 1?

Переформулирую. Вот нашли Вы лишние строки.
Удаляете запросом delete from table where stat = "A" and nomer = 165. А запрос удалит все три строки, 1, 3 и 7.

И совсем другой расклад, если бы был уникальный номер строки и запрос бы превратился в
delete from table where stat = "A" and nomer = 165 and row_number in (1,3). И строка 7 осталась бы на месте.

Или Вам все равно, какие 2 из 3-х строк (1-3-7) удалить? То есть нужно просто почистить таблицу?


А Вы сделайте так - insert into table2 select tt.stat,tt.nomer from (select stat,nomer,row_number() over (partition by stat,nomer order by nomer desc) as row_number_in_tuple) tt where tt.row_number_in_tuple = 1
И таки затем truncate table, после чего insert into table () select * from table2 и затем drop table2.
Как Вам такой вариант?
...
Рейтинг: 0 / 0
08.08.2018, 15:34
    #39684885
wilwin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов в таблице
Нет, какие строки удалять не все равно. Необходимо оставить последнюю из "пачки" дубликатов.
Я добавил колонку авкоинкримента id, теперь каждая строка имеет свой уникальный номер.

stat | nomer | id
A | 569 | 1
A | 765 | 2
T | 138 | 3
A | 569 | 4
T | 366 | 5
A | 138 | 6
T | 555 | 7
T | 569 | 8

Только как указать удаляемые значения для каждой пачки дублей???

SELECT * FROM doc WHERE nomer IN (SELECT nomer FROM doc GROUP BY nomer HAVING Count(*) > 1) ORDER BY nomer , id desc
...
Рейтинг: 0 / 0
08.08.2018, 16:50
    #39684941
Синий Слон
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов в таблице
ctid
...
Рейтинг: 0 / 0
08.08.2018, 20:14
    #39685042
wilwin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов в таблице
Вот написал запрос:


delete from doc
where nomer
(
select nomer from (select id,stat,nomer, row_number() over (partition by nomer order by id desc ) as rnum from doc) t
where t.rnum>1
)


но он все равно удаляет все дубликаты,
...
Рейтинг: 0 / 0
09.08.2018, 08:20
    #39685184
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов в таблице
wilwinТаблица выглядит так:
statnomerIDA1651A1972T1653A2384T8545A1976А1657
необходимо выбрать дубли колонки nomer, это записи 1 и 3 и 7 (165),
2 и 6 (197) и удалить соответственно 1 , 2, 3wilwinВот написал запрос:


delete from doc
where nomer
(
select nomer from (select id,stat,nomer, row_number() over (partition by nomer order by id desc ) as rnum from doc) t
where t.rnum>1
)


но он все равно удаляет все дубликаты,
Вот так попробуйте:
Код: sql
1.
2.
delete from doc
 where id not in (select max(id) from doc group by nomer) ;

Для проверки: ссылка
...
Рейтинг: 0 / 0
09.08.2018, 11:20
    #39685329
wilwin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов в таблице
Да, СПАСИБО Анна, то что нужно.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Удаление дубликатов в таблице / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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